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+iview分页组件的封装
Nov 17 Vue.js
Vue如何循环提取对象数组中的值
Nov 18 Vue.js
vue + el-form 实现的多层循环表单验证
Nov 25 Vue.js
vue3.0+vue-router+element-plus初实践
Dec 02 Vue.js
Vue实现图书管理小案例
Dec 03 Vue.js
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
详解Vue2的diff算法
Jan 06 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
学习 Vue.js 遇到的那些坑
Feb 02 Vue.js
vue中h5端打开app(判断是安卓还是苹果)
Feb 26 Vue.js
VUE使用draggable实现组件拖拽
Apr 06 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
Python作用域用法实例详解
2016/03/15 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
windows下python安装小白入门教程
2018/09/18 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
澳大利亚拥有最佳跳伞降落点和最好服务的跳伞项目运营商:Skydive Australia
2018/03/05 全球购物
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
商务英语求职自荐信范文
2013/12/24 职场文书
岗位职责风险防控
2014/02/18 职场文书
电子商务助理求职自荐信
2014/04/10 职场文书
无私奉献演讲稿
2014/09/04 职场文书
小学英语听课心得体会
2016/01/14 职场文书
资产移交协议书
2016/03/24 职场文书
windows server2016安装oracle 11g的图文教程
2022/07/15 Servers