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

╰半橙微兮° 2023-06-22 09:27 119阅读 0赞

ant-design-vue 实现表格内表单字段验证

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

  • 下单数量 内容不能为空
  • 下单数量 必须输入正整数
    在这里插入图片描述

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

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

  1. <a-table :columns="columns" bordered :rowKey="col => col.id" :dataSource="tableData" >
  2. <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">
  3. <a-input style="width: 100%" :min="1" v-model="text.goodModelCount" @change="handleChange(text.goodModelCount, record.id)" />
  4. </a-form-item>
  5. <div slot="action" slot-scope="text, record">
  6. <a href="javascript:;"><a-icon type="delete" /></a>
  7. </div>
  8. </a-table>
  9. <script>
  10. const columns = [
  11. { title: '商品名称', dataIndex: 'id', align: 'center' },
  12. { title: '商品型号', dataIndex: 'account', align: 'center' },
  13. { title: '型号价格', dataIndex: 'area', align: 'center' },
  14. { title: '下单数量', key: 'goodModelCount', align: 'center', width: '200px', scopedSlots: { customRender: 'goodModelCount' }, align: 'center', },
  15. { title: '操作', scopedSlots: { customRender: 'action' }, width: '150px', align: 'center',}
  16. ]
  17. function validatePrimeNumber(number) {
  18. if (/^[1-9]\d*|0$/.test(number)) {
  19. return {
  20. validateStatus: 'success',
  21. errorMsg: '',
  22. };
  23. }
  24. return {
  25. validateStatus: 'error',
  26. errorMsg: '下单数量不能为空',
  27. };
  28. }
  29. export default {
  30. name: 'order-dialog',
  31. data() {
  32. return {
  33. visible: true,
  34. labelCol: {
  35. xs: { span: 24 },
  36. sm: { span: 7 },
  37. },
  38. wrapperCol: {
  39. xs: { span: 24 },
  40. sm: { span: 12 },
  41. },
  42. form: this.$form.createForm(this),
  43. validatorRules: {
  44. consigneeName: {
  45. rules: [
  46. { required: true, message: '请输入收货人姓名' }
  47. ]
  48. },
  49. consigneePhone: {
  50. rules: [
  51. { required: true, message: '请输入收货人联系电话' }
  52. ]
  53. },
  54. addresseeAddressDetail: {
  55. rules: [
  56. { required: true, message: '请输入收货地址详情' }
  57. ]
  58. }
  59. },
  60. columns: columns,
  61. tableData: [{ id: 1, account: 123, area: 123, goodModelCount: 3434}, { id: 2, account: 123, area: 123, goodModelCount: 111}],
  62. goodModelCountData: []
  63. }
  64. },
  65. methods: {
  66. getFildStatus(id) {
  67. const data = this.goodModelCountData.filter(item => id === item.id)[0]
  68. if (data) {
  69. return data
  70. } else {
  71. return {
  72. errorMsg: '',
  73. validateStatus: 'success'
  74. }
  75. }
  76. },
  77. handleChange(value, id) {
  78. const newData = [...this.tableData];
  79. const target = newData.filter(item => item.id === id)[0]
  80. if (target) {
  81. const { errorMsg, validateStatus } = validatePrimeNumber(value)
  82. let flag = true
  83. this.goodModelCountData.forEach(val => {
  84. if (val.id === id) {
  85. flag = false
  86. val.errorMsg = errorMsg,
  87. val.validateStatus = validateStatus
  88. }
  89. })
  90. if (flag) {
  91. this.goodModelCountData.push({
  92. id,
  93. errorMsg,
  94. validateStatus
  95. })
  96. }
  97. target.goodModelCount = value
  98. this.tableData = newData
  99. }
  100. },
  101. handleOk() {
  102. this.visible = false
  103. }
  104. }
  105. }
  106. </script>

重点注意两个属性:

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

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

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

  1. <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">
  2. <a-input style="width: 100%" :min="1" v-model="text.goodModelCount" @change="handleChange(text.goodModelCount, record.id)" />
  3. </a-form-item>

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

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

发表评论

表情:
评论列表 (有 0 条评论,119人围观)

还没有评论,来说两句吧...

相关阅读

    相关 odoo17 | 视图字段验证约束

    前言 前一章介绍了向模型添加一些业务逻辑的能力。现在我们可以将按钮链接到业务代码,但是我们如何防止用户输入错误的数据呢?例如,在我们的房地产模块中,没有什么可以阻止用户设