vue + el-form 实现的多层循环表单验证

html

<el-form :model=\"formObj\" :rules=\"rules\" ref=\"ruleForm\">
 <el-form-item :label=\"\'护理记录项目配置:\'\" label-width=\"180px\">
  <template v-for=\"(formItem, index) in formObj.formDictExtendDoList\">
   <div class=\"hljl-container\" :key=\"formItem.id\">
    <el-row>
     <el-col :span=\"8\">
      <el-form-item
       :label=\"\'字段名称:\'\"
       label-width=\"90px\"
       :rules=\"rules.fieldName\"
       :prop=\"\'formDictExtendDoList.\'+index+\'.fieldName\'\"
      >
       <el-input
        v-model.trim=\"formItem.fieldName\"
        type=\"text\"
        :clearable=\"true\"
        maxLength=\"100\"
        placeholder=\"请输入\"
       />
       <!--@blur=\"isRepeat(formItem, index, \'fieldName\')\"-->
      </el-form-item>
     </el-col>
     <template
      v-for=\"(child, index1) in formItem.item\"
      v-show=\"formItem.type === 2\"
     >
      <el-col :span=\"8\" :key=\"child.id\">
       <el-form-item
        :label=\"\'选项\' + (index1+1) + \':\'\"
        label-width=\"90px\"
        :rules=\"rules.value\"
        :prop=\"\'formDictExtendDoList.\'+index+\'.item.\'+index1+\'.value\'\"
       >
        <el-input
         v-model.trim=\"child.value\"
         @input=\"forceUpdate\"
         :clearable=\"true\"
         type=\"text\"
         maxlength=\"20\"
         placeholder=\"请输入\"
        />
       </el-form-item>
      </el-col>
     </template>
    </el-row>
   </div>
  </template>
 </el-form-item>
</el-form>

js

let _THAT
export
default {
  name: \'formMangeAdd\',
  data() {
    return {
      formObj: {
        formDictExtendDoList: []
      },
      rules: {
        fieldName: [{
          required: true,
          message: \'请输入\',
          trigger: \'blur\'
        }, {
          validator: this.itemValidator,
          trigger: \'blur\'
        }],
        value: [{
          validator: (rule, value, callback) = > {
            // I\'m a genius.
            let that = _THAT
            that.forceUpdate()
            let field = rule.field
            let arr = field.split(\'.\')
            let index = +arr[1]
            let index1 = +arr[3]
            let _value = that.formObj.formDictExtendDoList[index].item[index1].value
            if (_value === \'\' || _value === null || _value === undefined) {
              callback(new Error(\'请输入\'))
            } else {
              callback()
            }
          },
          trigger: \'blur\'
        }]
      }
    }
  },
  beforeCreate() {
    _THAT = this
  },
  created() {
    // 测试数据
    let test = [{
      id: \'id_1595641858891\',
      // 唯一配置id
      fieldName: \'字段名称\',
      // 字段名称
      item: []
    }, {
      id: \'id_1595641858892\',
      // 唯一配置id
      fieldName: \'字段名称\',
      // 字段名称
      item: []
    }, {
      id: \'id_1595641858893\',
      // 唯一配置id
      fieldName: \'字段名称\',
      // 字段名称
      item: [{
        id: \'item_id_1595641858891\',
        // 唯一id
        value: \'选项1\'
      }, {
        id: \'item_id_1595641858892\',
        // 唯一id
        value: \'选项2\'
      }]
    }]
    this.formObj.formDictExtendDoList = test
  },
  methods: {
    /**
     * 重复性判断
     **/
    itemValidator: (rule, value, callback) = > {
      let that = _THAT
      that.forceUpdate()
      let field = rule.field
      let ruleArr = field.split(\'.\')
      let index = +ruleArr[1]
      let type = ruleArr[2]
      if (value === \'\') {
        callback()
        return false
      }
      let arr = []
      for (let i = 0; i < that.formObj.formDictExtendDoList.length; i++) {
        let formDictExtendDoListItem = that.formObj.formDictExtendDoList[i]
        let formDictExtendDoListFieldName = formDictExtendDoListItem.fieldName
        let formDictExtendDoListProjectName = formDictExtendDoListItem.projectName
        if (index !== i) {
          if (type === \'fieldName\') {
            if (formDictExtendDoListFieldName !== \'\') {
              if (formDictExtendDoListFieldName === value) {
                arr.push(i)
              }
            }
          }
        }
      }
      if (arr.length !== 0) {
        if (type === \'fieldName\') {
          callback(new Error(\'与配置\' + (+arr[0] + 1) + \'的字段名称重复\'))
          setTimeout(function() {
            that.formObj.formDictExtendDoList[index].fieldName = \'\'
          }, 500)
        }
      } else {
        callback()
      }
    },
    forceUpdate() {
      this.$forceUpdate()
    }
  }
}

以上就是vue + el-form 实现的多层循环表单验证的详细内容,更多关于vue 表单验证的资料请关注其它相关文章!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容