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


Posted in Vue.js onNovember 25, 2020

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 表单验证的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
如何使用 vue-cli 创建模板项目
Nov 19 Vue.js
Vue 的 v-model用法实例
Nov 23 Vue.js
vuex Module将 store 分割成模块的操作
Dec 07 Vue.js
在vue中动态修改css其中一个属性值操作
Dec 07 Vue.js
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
vue中配置scss全局变量的步骤
Dec 28 Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
vue3使用vue-router的完整步骤记录
Jun 20 Vue.js
vue ref如何获取子组件属性值
Mar 31 Vue.js
VUE使用draggable实现组件拖拽
Apr 06 Vue.js
vue实现登陆页面开发实践
May 30 Vue.js
vue打开其他项目页面并传入数据详解
Nov 25 #Vue.js
Vue开发中常见的套路和技巧总结
Nov 24 #Vue.js
浅析VUE防抖与节流
Nov 24 #Vue.js
解决vue页面刷新,数据丢失的问题
Nov 24 #Vue.js
Vue 的 v-model用法实例
Nov 23 #Vue.js
VUE+Element实现增删改查的示例源码
Nov 23 #Vue.js
Vue实现购物小球抛物线的方法实例
Nov 22 #Vue.js
You might like
PHP用mysql数据库存储session的代码
2010/03/05 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
微信小程序 rich-text的使用方法
2017/08/04 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
JS实现多选框的操作
2020/06/24 Javascript
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
Python Requests库基本用法示例
2018/08/20 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
使用Python的turtle模块画国旗
2019/09/24 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
婚鞋、新娘鞋、礼服鞋、童鞋:Nina Shoes
2019/09/04 全球购物
英语专业毕业生自荐信
2013/10/28 职场文书
求职简历中自我评价
2014/01/28 职场文书
水毁工程实施方案
2014/04/01 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
高中社区服务活动报告
2015/02/05 职场文书
公司放假通知怎么写
2015/04/15 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js