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中的new的使用方法与注意事项
May 16 Javascript
理解Javascript_06_理解对象的创建过程
Oct 15 Javascript
Javascript 垃圾收集机制介绍理解
May 14 Javascript
js克隆对象、数组的常用方法介绍
Sep 26 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
Jan 21 Javascript
纯javascript实现分页(两种方法)
Aug 26 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
Sep 08 Javascript
全屏滚动插件fullPage.js使用实例解析
Oct 21 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
Aug 18 Javascript
基于vue实现可搜索下拉框定制组件
Mar 26 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
Sep 30 Javascript
记录vue做微信自定义分享的一些问题
Sep 12 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自定义函数之递归删除文件及目录
2010/08/08 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
php中JSON的使用与转换
2015/01/14 PHP
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
jQuery动态产生select option下拉列表
2017/03/15 Javascript
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
深入理解Vue 的钩子函数
2018/09/05 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
vue+element实现图片上传及裁剪功能
2020/06/29 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
python发送邮件接收邮件示例分享
2014/01/21 Python
Python中非常实用的一些功能和函数分享
2015/02/14 Python
Python中字符串的处理技巧分享
2016/09/17 Python
利用Python破解验证码实例详解
2016/12/08 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
python 接口返回的json字符串实例
2018/03/27 Python
Python如何批量生成和调用变量
2020/11/21 Python
python基于opencv 实现图像时钟
2021/01/04 Python
解决Pycharm 运行后没有输出的问题
2021/02/05 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
Windows和Linux动态库应用异同
2016/07/28 面试题
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
护士自我评价范文
2014/01/25 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
幼儿园老师寄语
2014/04/03 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
Python3的进程和线程你了解吗
2022/03/16 Python
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js