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祖孙组件之间的数据传递案例
Dec 07 Vue.js
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
详解Vue2的diff算法
Jan 06 Vue.js
Vue实现简单计算器
Jan 20 Vue.js
Vue如何实现变量表达式选择器
Feb 18 Vue.js
原生JS封装vue Tab切换效果
Apr 28 Vue.js
Vue监视数据的原理详解
Feb 24 Vue.js
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
vue实现input输入模糊查询的三种方式
Aug 14 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
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
一个PHP的QRcode类与大家分享
2011/11/13 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
Python爬虫破解登陆哔哩哔哩的方法
2020/11/17 Python
python中os.remove()用法及注意事项
2021/01/31 Python
英国足球店:UK Soccer Shop
2017/11/19 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
工厂实习感言
2014/01/14 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
争做文明公民倡议书
2014/08/29 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
领导班子整改措施
2014/10/24 职场文书
店铺转让协议书
2015/01/29 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
迎新年主持词
2015/07/06 职场文书
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers