vue  elementUI 表单嵌套验证的实例代码


Posted in Javascript onNovember 06, 2019

一:表单一级验证

element中from组件内表单验证通过使用el-form标签,绑定model和rules属性进行表单验证

<el-form ref="form" :model="form" :rules="rules" label-width="110px" @submit.native.prevent>
<el-form-item label="客户名称:" size="small" prop="belongId">
  <el-input v-show="false" v-model="form.belongId"></el-input>
  <ComSelectorCustomer :value="form.customerName" @change="choice"></ComSelectorCustomer>
</el-form-item>

简单的表单验证很简单,在prop内绑定验证属性,然后在rules对象内定义验证方法

rules: {
     belongId: [{
      required: true,
      message: '不能为空',
      trigger: 'change'
     }]
}

二:模板一次循环渲染时表单验证

<el-row v-for="(item, index) in form.warehouseList" :key="index">
  <el-col :span="21">
    <el-form-item label="厂库名称:" size="small" :prop="'warehouseList.' + index + '.factoryName'">
      <el-select
       v-model="item.factoryName"
       clearable
       filterable>
       <el-option
         v-for="(child, ind) in factoryList"
         :key="ind"
         :label="child.label"
         :disabled="child.disabled"
         :value="child.value"></el-option>
      </el-select>
    </el-form-item>
   </el-col>
</el-row>

循环内模板验证prop绑定值就是一个问题了,因为它是循环出来的没办法直接写死在内,所以prop就需要动态绑定验证属性,这里需要注意一下,动态prop内绑定的是要和form内定义的属性名以及model绑定的值要对应上。比如上面prop里的factoryName,form.warehouseList里子元素也要有这个属性,select中model绑定的也应该是factoryName。因为是循环出来的,所以model绑定的就是‘item.factoryName'。

如果prop内绑定的验证属性名对应不上,控制台一般都会报下面这个错误

 ![cuowu.png](/img/bVbzWSa)

三:循环嵌套循环的表单验证

比如说是这种:

from: {
    warehouseList: [{
      productList: [{
        productNumber: '',
        productUnitPrice: ''
      }]
    }]
  }

要是需要监听productList中的productNumber,并且进行验证,这就是第三层的验证。

<div v-for="(itemChild, itemIndex) in item.productList" :key="itemIndex">
   <el-col :span="9">
   <el-form-item label="客户品名:" label-width="110px" size="small" :prop="'warehouseList.' + index + '.productList.' + itemIndex + '.productName'">
    <el-input v-show="false" v-model="itemChild.productName"></el-input>
    <ComSelectorProduct :value="itemChild.productName"
    @change="choice"></ComSelectorProduct>
   </el-form-item>
 </el-col>
 <el-col :span="4">
   <el-form-item label="数量:" label-width="60px" size="small" :prop="'warehouseList.' + index + '.productList.' + itemIndex + '.productNumber'">
    <el-input clearable v-model="itemChild.productNumber" placeholder="数量"></el-input>
   </el-form-item>
 </el-col>
</div>

prop内绑定的值需要把第一层循环时的父元素warehouseList一并写上一直写到input内绑定的model值

:prop="'warehouseList.' + index + '.productList.' + itemIndex + '.productName'"

验证方法:

setRulesProduct() {
        let that = this
        let list1 = that.form.warehouseList
        // let list2 = that.form.warehouseList.productList
        if (list1 && list1.length) {
          list1.forEach((item, i) => {
            that.rules['warehouseList.' + i + '.factoryName'] = [{
              required: true,
              message: '请选择厂库',
              trigger: 'change'
            }]
            that.rules['warehouseList.' + i + '.orderNumber'] = [{
              required: true,
              min: 1,
              max: 20,
              validator: (rule, value, callback) => {
                if (!value) {
                  callback(new Error('订单号不能为空'))
                } else if (value.length < 1 || value.length > 20) {
                  callback(new Error('订单号请保持在1-20字符内'))
                } else {
                  callback()
                }
              },
              trigger: 'blur'
            }]
            that.rules['warehouseList.' + i + '.deliveryTime'] = [{
              required: true,
              message: '请选择日期',
              trigger: 'blur'
            }]

            if (item.productList && item.productList.length) {
              item.productList.forEach((childItem, childIndex) => {
                that.rules['warehouseList.' + i + '.productList.' + childIndex + '.productName'] = [{
                  required: true,
                  message: '请选择产品',
                  trigger: 'change'
                }]
                that.rules['warehouseList.' + i + '.productList.' + childIndex + '.productNumber'] = [{
                  required: true,
                  min: 1,
                  max: 20,
                  validator: (rule, value, callback) => {
                    if (!value) {
                      callback(new Error('产品数量不能为空'))
                    } else if (value.length < 1 || value.length > 20) {
                      callback(new Error('产品数量请保持在1-20字符内'))
                    } else {
                      callback()
                    }
                  },
                  trigger: 'blur'
                }]
                that.rules['warehouseList.' + i + '.productList.' + childIndex + '.productUnitPrice'] = [{
                  required: true,
                  message: '请填写单价',
                  trigger: 'blur'
                }]
              })
            }
          })
        }
      }

在组件创建时调用次方法就可以了。多层嵌套验证就搞定了,互不影响。

最重要的一点就是 循环时prop内绑定的验证属性名 一定要和model绑定的值相对应上,循环嵌套过多的就需要一直往上层找,找到最上层元素。

总结

以上所述是小编给大家介绍的vue + elementUI 表单嵌套验证,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
js验证是否为数字的总结
Apr 14 Javascript
解析JavaScript中的标签语句
Jun 19 Javascript
JS中setTimeout的巧妙用法前端函数节流
Mar 24 Javascript
jQuery实现的跨容器无缝拖动效果代码
Jun 21 Javascript
AngularJS 表达式详解及实例代码
Sep 14 Javascript
JavaScript面试题大全(推荐)
Sep 22 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
Jan 22 Javascript
react-native-fs实现文件下载、文本存储的示例代码
Sep 22 Javascript
JS计算距当前时间的时间差实例
Dec 29 Javascript
vue中element 的upload组件发送请求给后端操作
Sep 07 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
Sep 21 Javascript
vue+swiper实现左右滑动的测试题功能
Oct 30 Javascript
微信小程序网络请求实现过程解析
Nov 06 #Javascript
vue 自定义右键样式的实例代码
Nov 06 #Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 #Javascript
vue 解决computed修改data数据的问题
Nov 06 #Javascript
微信小程序页面渲染实现方法
Nov 06 #Javascript
微信小程序页面间传递数组对象方法解析
Nov 06 #Javascript
vue 获取及修改store.js里的公共变量实例
Nov 06 #Javascript
You might like
ajax缓存问题解决途径
2006/12/06 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
浅谈js原生拖放
2016/11/21 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
基于vue实现探探滑动组件功能
2020/05/29 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
python制作websocket服务器实例分享
2016/11/20 Python
对python周期性定时器的示例详解
2019/02/19 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
年终晚会主持词
2014/03/25 职场文书
马智宇结婚主持词
2014/04/01 职场文书
库房保管员岗位职责
2014/04/07 职场文书
文秘自荐信
2014/06/28 职场文书
校园元旦活动总结
2014/07/09 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
物理课外活动总结
2014/08/27 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
还款承诺书范本
2015/01/20 职场文书
公司总经理岗位职责
2015/04/01 职场文书
质量整改通知单
2015/04/21 职场文书
签约仪式致辞
2015/07/30 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python