Home  >  Article  >  Web Front-end  >  How Vue+ElementUI handles oversized forms

How Vue+ElementUI handles oversized forms

青灯夜游
青灯夜游forward
2021-11-22 19:49:492356browse

This article will take you through how Vue ElementUI handles very large forms. I hope it will be helpful to you!

How Vue+ElementUI handles oversized forms

Due to recent business adjustments in the company, the logic of the previous long form has changed a lot, so I plan to reconstruct it (it was written by a background manager who has resigned. , and there are no comments. One component has 4000 lines written, which is really powerless). For your convenience, I have split the project into 14 components and simplified them.

Overall idea

  • Large forms are split according to business modules
  • Use validate# provided by el-form when saving ##Method for verification (Loop to verify each split component)
  • mixin public extraction of each component (also conducive to the maintenance of later projects)
[Related recommendation: "

vue.js Tutorial"]

Start

    Here we use
  • to split 2 componentsFor example: form1, form2 (for the convenience of readers, do not use names)
  • Why are the two components here
  • ref and model tied together? The determined ones are all form will be explained later (for the convenience of later maintenance)
  • // form1 组件
    <template>
        <el-form
          ref="form"
          :model="form"
          label-width="10px"
        >
          <el-form-item label="姓名" prop="name">
              <el-input v-model="form.name" />
          </el-form-item>
        </el-form>
    </template>
    <script>
    export default {
      name: &#39;Form1&#39;,
        props: {
          form: {}
      },
      data() {
        return {
          rules: {
            name: [
              { required: true, message: &#39;请输入姓名&#39;, trigger: &#39;blur&#39; }
            ]
          }
        }
      },
      methods: {
        // 这里是是为了父组件循环调用校验
        validForm() {
            let result = false
            this.$refs.form.validate(valid => valid && (result = true))
            return result
        }
        // 我这里还用了另一种方式写的,但是循环校验的时候是promise对象,有问题,望大佬们指点一二
        validForm() {
            // 明明这里输出的结构是 Boolean 值,但在父组件循环调用之后就是promise类型,需要转换一下才行
            return this.$refs.form.validate().catch(e => console.log(e))
        }
      }
    }
    </script>
    
    // form2 组件
    <template>
        <el-form
          ref="form"
          :model="form"
          label-width="10px"
        >
          <el-form-item label="年龄" prop="age">
              <el-input v-model="form.age" />
          </el-form-item>
        </el-form>
    </template>
    <script>
    export default {
      name: &#39;Form2&#39;,
      props: {
          form: {}
      },
      data() {
        return {
          rules: {
            name: [
              { required: true, message: &#39;请输入年龄&#39;, trigger: &#39;blur&#39; }
            ]
          }
        }
      },
      methods: {
        // 这里是是为了父组件循环调用校验
        validForm() {
            let result = false
            this.$refs.form.validate(valid => valid && (result = true))
            return result
        }
      }
    }
    </script>
    Look at how the parent component is referenced
  • // 父组件
    <template>
        <div class="parent">
            <form1 ref="form1" :form="formData.form1" />
            <form2 ref="form2" :form="formData.form2" />
            <el-button type="primary" @click="save">报错</el-button>
        </div>
    </template>
    <script>
    ... 省略引用
    export default {
        name: &#39;parent&#39;,
        ... 省略注册
        data () {
            return {
                formData: {
                    form1: {},
                    form2: {}
                }
            }
        },
    }
    </script>
    Since the attribute names
  • form1 and form2 in formData are used on the ref of the subform component respectively, they can be Find them in turn during traversal and modify the save function. The code is as follows:
  • methods: {
        save () {
            // 每个表单对象的 key 值,也就是每个表单的 ref 值
            const formKeys = Object.keys(this.formData)
            // 执行每个表单的校验方法
            const valids = formKeys.map(item => this.$refs[item].validForm())
            // 所有表单通过检验之后的逻辑
            if (valids.every(item => item)) {
              console.log(11)
            }
        }
    }
Answer why the two components

ref and model are bound to form

    By comparison we can find that
  • form1 form2 has common props methods
  • We extract it through mixin
  • export default {
      props: {
        form: {
          required: true,
          type: Object,
          default: () => {}
        },
      },
      methods: {
        validForm () {
          let result = false
          this.$refs.form.validate(valid => valid && (result = true))
          return result
        }
      }
    }
    Reference the
  • minix in form1 form2 and delete the corresponding properties and methods in the corresponding component
End

    It is very troublesome to solve the extremely large form. Here we only split the components.
  • The linkage between components is also a big difficulty. We will send it out after finishing it next time.
  • You are welcome to discuss how you solved it in the comment area, and you are also welcome to point out the shortcomings to the author
For more programming-related knowledge, please visit:

Introduction to Programming! !

The above is the detailed content of How Vue+ElementUI handles oversized forms. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:juejin.cn. If there is any infringement, please contact admin@php.cn delete