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实现广告栏上下滚动效果
Nov 26 Vue.js
vue单元格多列合并的实现
Nov 26 Vue.js
vuex的数据渲染与修改浅析
Nov 26 Vue.js
vue从后台渲染文章列表以及根据id跳转文章详情详解
Dec 14 Vue.js
vue 通过base64实现图片下载功能
Dec 19 Vue.js
为什么推荐使用JSX开发Vue3
Dec 28 Vue.js
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
Vue实现摇一摇功能(兼容ios13.3以上)
Jan 26 Vue.js
Vue+Bootstrap实现简易学生管理系统
Feb 09 Vue.js
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
Vue3中的Refs和Ref详情
Nov 11 Vue.js
vue实现滑动解锁功能
Mar 03 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 memcache扩展的三种安装方法
2009/04/26 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
百度地图API使用方法详解
2015/08/25 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
js分页工具实例
2015/01/28 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
[06:45]DOTA2-DPC中国联赛 正赛 Magma vs LBZS 选手采访
2021/03/11 DOTA
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
python创造虚拟环境方法总结
2019/03/04 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
如何使用css3实现一个类在线直播的队列动画的示例代码
2020/06/17 HTML / CSS
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
C#如何进行LDAP用户校验
2012/11/21 面试题
冰雪公主观后感
2015/06/16 职场文书
拔河比赛新闻稿
2015/07/17 职场文书