美文网首页Dev_Web
【Vue+ElementUI】表单校验(二)——动态表单项

【Vue+ElementUI】表单校验(二)——动态表单项

作者: iamsharleen | 来源:发表于2018-03-15 17:29 被阅读0次

    Element中表单验证的基本方法可参照 官方说明

    <el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="100px" class="demo-dynamic">
      <el-form-item
        prop="email"
        label="邮箱"
        :rules="[
          { required: true, message: '请输入邮箱地址', trigger: 'blur' },
          { type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur,change' }
        ]"
      >
        <el-input v-model="dynamicValidateForm.email"></el-input>
      </el-form-item>
      <el-form-item
        v-for="(domain, index) in dynamicValidateForm.domains"
        :label="'域名' + index"
        :key="domain.key"
        :prop="'domains.' + index + '.value'"
        :rules="{
          required: true, message: '域名不能为空', trigger: 'blur'
        }"
      >
        <el-input v-model="domain.value"></el-input><el-button @click.prevent="removeDomain(domain)">删除</el-button>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm('dynamicValidateForm')">提交</el-button>
        <el-button @click="addDomain">新增域名</el-button>
        <el-button @click="resetForm('dynamicValidateForm')">重置</el-button>
      </el-form-item>
    </el-form>
    
    <script>
      export default {
        data() {
          return {
            dynamicValidateForm: {
              domains: [{
                value: ''
              }],
              email: ''
            }
          };
        },
        methods: {}
      }
    </script>
    

    这是官方的一个例子,例子中包含一个表单,数据结构是:

    dynamicValidateForm:{
        email:'', // 基本属性
        domains:[] // 数组
    }
    

    "域名"表单项用了一个v-for来动态新增,需要注意的是:prop的值,常见的错误信息是"Error: please transfer a valid prop path to form item!",例子中使用的是'domains.' + index + '.value',其实和prop="email"类似,用链式结构表示。

    如果 ,数据的结构是

    dynamicValidateForm:{}
    domains:[]
    

    要整理成以上的结构(如果一定要这样实现),容易有坑!!

    <el-form-item
        v-for="(domain, index) in dynamicValidateForm.domains"
        :label="'域名' + index"
        :key="domain.key"
        :prop="'domains.' + index + '.value'"
        :rules="{
          required: true, message: '域名不能为空', trigger: 'blur'
        }"
      >
      <!-- 选择框-->
      <el-select filterable v-model="domain.value" placeholder="请选择" >
         <el-option
             v-for="item in domain.options"
             :key="item.value"
             :label="item.label"
             :value="item.value" >
          </el-option>
        </el-select>
      </el-form-item>
    
    <script>
      export default {
         data () {
          dynamicValidateForm:{
            email:'', // 基本属性
            domains:[] // 数组
          }
        },
        created () {
          this.id = this.$route.params.id
          // 有ID,则是编辑页面,否则是新增页面
          if(this.id){
            this.getData()
          }
        },
        methods: {
            getData(){
               getData(this.id).then(res => {
                 this.dynamicValidateForm = res.data.dynamicValidateForm 
                 this.dynamicValidateForm.domains = res.data.domains
                })
            }
        }
      }
    </script>
    

    进入页面后,发现进入编辑页面后,选择框选择后没反应了,页面也没有报错~~~
    为什么呢?
    找了半天原因,找了<select>的文档,没发现问题 ~~~~~

    终于,

    this.dynamicValidateForm = res.data.dynamicValidateForm this.dynamicValidateForm.domains = res.data.domains
    

    这两行代码,第一行由于res.data.dynamicValidateForm就是一个object,它并没有domains这个属性,赋值后,dynamicValidateForm 中也没有domains这个属性了。而第二行代码,赋值给domains ,没有报错,可是使用的时候,这个属性却不会生效。而<select>绑定的可是domains 中的值。。

    解决方法:

    this.$set(this.dynamicValidateForm,'domains ',res.data.domains)
    

    在vue.js中,给对象赋值,最好还是使用$set

    相关文章

      网友评论

        本文标题:【Vue+ElementUI】表单校验(二)——动态表单项

        本文链接:https://www.haomeiwen.com/subject/rdkhqftx.html