ant-design-vue 实现表格内部字段验证功能


Posted in Javascript onDecember 16, 2019

表格内 column 可输入的需求还是很常见的,尤其有一些业务场景就是表单内部有一个表格,然后表格的某些列是个进行输入的,就像下面这样

  • 下单数量 内容不能为空
  • 下单数量 必须输入正整数

ant-design-vue 实现表格内部字段验证功能

翻阅 ant-design-vue 官网并没有发现说表单内表格字段验证的方案,但是有一个 自行处理表单数据 的介绍

ant-design-vue 实现表格内部字段验证功能

那我们是不是可以参考这个方案去实现咱自己的业务需求呢,下面就开始说一下实现方案

<a-table
 :columns="columns"
 bordered
 :rowKey="col => col.id"
 :dataSource="tableData"
>

 <a-form-item 
  :label-col="{
   xs: { span: 0 },
   sm: { span: 0 },
  }"
  :wrapper-col="{
   xs: { span: 24 },
   sm: { span: 24 },
  }"
  :validate-status="getFildStatus(record.id).validateStatus"
  :help="getFildStatus(record.id).errorMsg"
  slot="goodModelCount" 
  slot-scope="text, record">
  <a-input
   style="width: 100%"
   :min="1"
   v-model="text.goodModelCount"
   @change="handleChange(text.goodModelCount, record.id)"
  />
 </a-form-item>

 <div slot="action" slot-scope="text, record">
  <a href="javascript:;" rel="external nofollow" ><a-icon type="delete" /></a>
 </div>
</a-table>

<script>
const columns = [
 { title: '商品名称', dataIndex: 'id', align: 'center' },
 { title: '商品型号', dataIndex: 'account', align: 'center' },
 { title: '型号价格', dataIndex: 'area', align: 'center' },
 { title: '下单数量', key: 'goodModelCount', align: 'center', width: '200px', scopedSlots: { customRender: 'goodModelCount' }, align: 'center', },
 { title: '操作', scopedSlots: { customRender: 'action' }, width: '150px', align: 'center',}
]

function validatePrimeNumber(number) {
 if (/^[1-9]\d*|0$/.test(number)) {
  return {
   validateStatus: 'success',
   errorMsg: '',
  };
 }
 return {
  validateStatus: 'error',
  errorMsg: '下单数量不能为空',
 };
}
export default {
 name: 'order-dialog',
 data() {
  return {
   visible: true,
   labelCol: {
    xs: { span: 24 },
    sm: { span: 7 },
   },
   wrapperCol: {
    xs: { span: 24 },
    sm: { span: 12 },
   },
   form: this.$form.createForm(this),
   validatorRules: {
    consigneeName: {
     rules: [
      { required: true, message: '请输入收货人姓名' }
     ]
    },
    consigneePhone: {
     rules: [
      { required: true, message: '请输入收货人联系电话' }
     ]
    },
    addresseeAddressDetail: {
     rules: [
      { required: true, message: '请输入收货地址详情' }
     ]
    }
   },
   columns: columns,
   tableData: [{ id: 1, account: 123, area: 123, goodModelCount: 3434}, { id: 2, account: 123, area: 123, goodModelCount: 111}],
   goodModelCountData: []
  }
 },
 methods: {
  getFildStatus(id) {
   const data = this.goodModelCountData.filter(item => id === item.id)[0]
   if (data) {
    return data
   } else {
    return {
     errorMsg: '',
     validateStatus: 'success'
    }
   }
  },

  handleChange(value, id) {
   const newData = [...this.tableData];
   const target = newData.filter(item => item.id === id)[0]
   if (target) {
    const { errorMsg, validateStatus } = validatePrimeNumber(value)
    let flag = true
    this.goodModelCountData.forEach(val => {
     if (val.id === id) {
      flag = false
      val.errorMsg = errorMsg,
      val.validateStatus = validateStatus
     }
    })

    if (flag) {
     this.goodModelCountData.push({
      id,
      errorMsg,
      validateStatus
     })
    }
    target.goodModelCount = value
    this.tableData = newData
   }
  },
  handleOk() {
   this.visible = false
  }
 }
}
</script>

重点注意两个属性:

  • validate-status 校验状态,可选 ‘success', ‘warning', ‘error', ‘validating'
  • help 设置校验文案

在 vue 里面是允许我们在属性里面以 函数 的形式返回属性的,所以我们可以把验证规则放到函数里里面 validatePrimeNumber (函数名字最好还是语义化明确一些,我这边直接复制的官方文档上的)

需要进行验证的字段(需要在 a-table 标签内部)

<a-form-item 
 :label-col="{
  xs: { span: 0 },
  sm: { span: 0 },
 }"
 :wrapper-col="{
  xs: { span: 24 },
  sm: { span: 24 },
 }"
 :validate-status="getFildStatus(record.id).validateStatus"
 :help="getFildStatus(record.id).errorMsg"
 slot="goodModelCount" 
 slot-scope="text, record">
 <a-input
  style="width: 100%"
  :min="1"
  v-model="text.goodModelCount"
  @change="handleChange(text.goodModelCount, record.id)"
 />
</a-form-item>

当我们输入框进行输入的时候我们就会出发 handleChange 方法,在方法里里面我们去进行输入内容的验证,然后根据id从 getFildStatus 找到当前对象,然后进行验证。

如果列表内有多列需要进行验证,那么就需要主要这个数据格式怎么定了了,根据实际需求进行参考

总结

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

Javascript 相关文章推荐
javascript 回调函数详解
Nov 11 Javascript
JavaScript6 let 新语法优势介绍
Jul 15 Javascript
JS实现输入框提示文字点击时消失效果
Jul 19 Javascript
微信小程序  简单实例(阅读器)的实例开发
Sep 29 Javascript
js在ie下打开对话窗口的方法小结
Oct 24 Javascript
使用jQuery.Pin垂直滚动时固定导航
May 24 jQuery
vue双花括号的使用方法 附练习题
Nov 07 Javascript
Vue服务器渲染Nuxt学习笔记
Jan 31 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
Jun 19 Javascript
Javascript 对象(object)合并操作实例分析
Jul 30 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
Mar 08 Javascript
通过实例解析JavaScript for in及for of区别
Jun 15 Javascript
js DOM的事件常见操作实例详解
Dec 16 #Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 #Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
Dec 16 #Javascript
javascript自定义右键菜单插件
Dec 16 #Javascript
js中的面向对象之对象常见创建方法详解
Dec 16 #Javascript
js实现数字滚动特效
Dec 16 #Javascript
NUXT SSR初级入门笔记(小结)
Dec 16 #Javascript
You might like
php处理文件的小例子(解压缩,删除目录)
2013/02/03 PHP
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
Nginx实现反向代理
2017/09/20 Servers
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
js实现ajax的用户简单登入功能
2020/06/18 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
对python中return和print的一些理解
2017/08/18 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
pandas数值计算与排序方法
2018/04/12 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
Python简单基础小程序的实例代码
2019/04/28 Python
python 求定积分和不定积分示例
2019/11/20 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
python绘制动态曲线教程
2020/02/24 Python
python 使用tkinter+you-get实现视频下载器
2020/11/17 Python
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
银行会计职员个人的自我评价
2013/09/29 职场文书
周年庆典邀请函范文
2014/01/24 职场文书
家长写给孩子的评语
2014/04/18 职场文书
商务经理岗位职责
2014/08/03 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
检讨书格式
2015/01/23 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
MySQL创建高性能索引的全步骤
2021/05/02 MySQL