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中音频wavesurfer.js的使用方法
Feb 20 Vue.js
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 Vue.js
浅析vue中的nextTick
Dec 28 Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
vue 动态生成拓扑图的示例
Jan 03 Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
vue实现防抖的实例代码
Jan 11 Vue.js
vue浏览器返回监听的具体步骤
Feb 03 Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
vue postcss-px2rem 自适应布局
May 15 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中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
php的dl函数用法实例
2014/11/06 PHP
kmock javascript 单元测试代码
2011/02/06 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
带你认识Django
2019/01/15 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
canvas使用注意点总结
2013/07/19 HTML / CSS
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
Linux Interview Questions For software testers
2012/06/02 面试题
个人简历自我评价范文
2014/02/04 职场文书
大学生党员自我批评
2014/02/14 职场文书
演讲稿的写法
2014/05/19 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
个人工作表现评价材料
2014/09/21 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
趣味运动会广播稿
2015/08/19 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫