Ant Design Vue Table 行合并的实现方式

文章介绍了如何在AntDesignVueTable中使用自定义函数getRowSpanCount实现列的行合并,当特定字段值相同时合并行。函数通过遍历和比较数组元素来确定行合并的行数,确保数据按预期顺序排列以便正确显示行合并效果。
摘要由CSDN通过智能技术生成

首先封装实现函数如下

function getRowSpanCount (data, key, mainKey, target) {
  if (!Array.isArray(data)) return 1
  
  // 只取出筛选项
  const mainData = data.map(_ => {
return _[mainKey]
})

// 只取出筛选项
  data = data.map(_ => {
return _[key]
}) 

  let preValue = data[0]
  let mainValue = mainData[0]
  const res = [[preValue]] // 放进二维数组里
  let index = 0 // 二维数组下标
  for (let i = 1; i < data.length; i++) {
    if (data[i] === preValue && mainData[i] === mainValue) {
      // 相同放进二维数组
      res[index].push(data[i])
    } else {
      // 不相同二维数组下标后移
      index += 1
      res[index] = []
      res[index].push(data[i])
      preValue = data[i]
      mainValue = mainData[i]
    }
  }
  const arr = []
  res.forEach(_ => {
    const len = _.length
    for (let i = 0; i < len; i++) {
      arr.push(i === 0 ? len : 0)
    }
  })
  return arr[target]
}

应用实例如下:

const columnPickItem = [
        {
          title: '物料编号',
          dataIndex: 'itemno',
          customRender: (value, row, index) => {
            const obj = {
              children: value,
              attrs: {}
            }
            obj.attrs.rowSpan = getRowSpanCount(this.noPickingData, 'itemno', 'itemId', index)
            return obj
          }
        },
        {
          title: '物料名称',
          dataIndex: 'itemname',
          customRender: (value, row, index) => {
            const obj = {
              children: value,
              attrs: {}
            }
            obj.attrs.rowSpan = getRowSpanCount(this.noPickingData, 'itemname', 'itemId', index)
            return obj
          }
        },
        {
          title: '规格型号',
          dataIndex: 'specifiCation',
          customRender: (value, row, index) => {
            const obj = {
              children: value,
              attrs: {}
            }
            obj.attrs.rowSpan = getRowSpanCount(this.noPickingData, 'specifiCation', 'itemId', index)
            return obj
          }
        },
        {
          title: '待备料数量',
          dataIndex: 'allcount',
          customRender: (value, row, index) => {
            const obj = {
              children: value,
              attrs: {}
            }
            obj.attrs.rowSpan = getRowSpanCount(this.noPickingData, 'allcount', 'itemId', index)
            return obj
          }
        },
        {
          title: '已备料数',
          dataIndex: 'pickcount',
          customRender: (value, row, index) => {
            const obj = {
              children: value,
              attrs: {}
            }
            obj.attrs.rowSpan = getRowSpanCount(this.noPickingData, 'pickcount', 'itemId', index)
            return obj
          }
        },
        {
          title: '单套数量',
          dataIndex: 'routecount',
          customRender: (value, row, index) => {
            const obj = {
              children: value,
              attrs: {}
            }
            obj.attrs.rowSpan = getRowSpanCount(this.noPickingData, 'routecount', 'itemId', index)
            return obj
          }
        },
        {
          title: '所在仓库名称',
          dataIndex: 'warehousename'
        },
        {
          title: '所在仓库编号',
          dataIndex: 'warehouseno'
        },
        {
          title: '所在库位名称',
          dataIndex: 'locationname'
        },
        {
          title: '所在库位编号',
          dataIndex: 'locationno'
        },
        {
          title: '批次号',
          dataIndex: 'lotNo'
        },
        {
          title: '包装号',
          dataIndex: 'packNo'
        },
        {
          title: '批次在库数量',
          dataIndex: 'count'
        },
        {
          title: '供应商',
          dataIndex: 'clientname'
        },
        {
          title: '备料数量',
          dataIndex: 'pickingCount',
          scopedSlots: {
            customRender: 'pickingCount'
          }
        }
      ]

实现逻辑及实现思路如下:
1.首先明确在 Ant Design Vue Table 的框架下要实现每一列行合并的方法是:
以从上往下的顺序来看待一个table,每一列的column属性都需要配置一个customRender如下

    {
       title: '物料编号',
       dataIndex: 'itemno',
       customRender: (value, row, index) => {
         const obj = {
           children: value,
           attrs: {}
         }
         obj.attrs.rowSpan = getRowSpanCount(this.noPickingData, 'itemno', 'itemId', index)
         return obj
       }
     },

并且设置对应的rowSpan数值,每一列对应的每一行rowSpan设置的数值就决定了行与行之间的合并方式。如一共三列三行数据,第一列第一行的rowSpan设置为3,第一列其余两行rowSpan设置为0则第一列的一到三行就会进行合并。(tips:有多少条数据或者说有多少行,该列对应配置的customRender函数就会执行多少次)

2.在明确官方实现逻辑的基础上进行函数封装做到自定义指定:当不同行中的一个或多个字段相同的情况下才进行行合并
上面函数封装内容从上往下的大概逻辑是:
(1) 校验传入的table数据类型
(2) 以传入的key, mainKey或更多的参数作为过滤条件,得到由所有table数据过滤所得仅包含对应字段的数组
(3) 设置初始值,创建二维数组,遍历数据执行逻辑:第二条数据与第一条数据做对比,当所有对应值相等,则把第二条数据对应值push进第一条数据所在二维数组的元素数组中,然后第三条数据再与第一条数据进行同样对比逻辑,直到遇到与第一条数据不满足所有对应值相等时,则该条数据在二维数组中新增一个数组元素,并作为该数组元素的第一个元素。然后继续进行遍历,后面的将该条数据作为前者进行对比,后续逻辑都相同了
(4) 然后再遍历上述二维数组,拿到我们所需要的该列所有行进行合并时所对应的rowSpan数字数组
(5)最后通过传入的行index,相应返回该行在rowSpan数字数组中所对应的数字

3.最终我们使用封装函数的方式如下

{
  title: '物料编号',
  dataIndex: 'itemno',
  customRender: (value, row, index) => {
    const obj = {
      children: value,
      attrs: {}
    }
    obj.attrs.rowSpan = getRowSpanCount(this.noPickingData, 'itemno', 'itemId', index)
    return obj
  }
},
 

意为在物料编号这一列,只要出现itemno和itemId这两个字段同时相等时,则进行行合并

补充:还有很重要的一点,后端反的数组数据顺序要和我们的要求相对应,如我们想要物料编号相同的行进行合并,则后端返回数据也必须是物料编号相同的数据都放在一起的这种顺序才行,不然rowSpan对应不上,就会显示的乱七八糟。(当然前端拿到无序数据自己处理后再用也可以,具体就看如何安排了)

### 回答1: ant-design-vue是一个基于Vue.js的UI组件库,提供了丰富的组件供开发者使用。在ant-design-vue中,我们可以使用表格组件来展示和编辑数据,同时还可以进表格的校验。 在ant-design-vue表格中,我们可以通过配置rules属性来实现校验功能。每个表格列都可以设置rules属性,该属性接受一个数组,数组中每个对象代表一条校验规则。 每条校验规则对象中需要指定validator属性,该属性是一个函数,用来校验对应表格列的数据。在validator函数中,我们可以根据具体需求编写校验逻辑,比如判断输入是否为空、是否满足特定格式等。validator函数需要返回一个Boolean值,true表示校验成功,false表示校验失败。 除了validator函数外,校验规则对象还可以指定message属性,用来定义校验失败时的提示信息。当校验失败时,ant-design-vue会自动显示message中的内容。 在表格使用校验功能时,我们可以通过监听表单提交事件来进校验。在提交事件中,我们可以通过表格的validate方法来执校验操作。validate方法会遍历所有表格列的校验规则,根据规则来验证数据。如果所有校验规则都通过,则提交成功;如果存在校验失败的规则,则提交失败,并且会自动显示相应的提示信息。 总结来说,通过ant-design-vue内置的校验功能,我们可以方便地对表格中的数据校验,提高用户输入的准确性和数据的可靠性。 ### 回答2: ant-design-vue(以下简称AntD)提供了一种方便的方式实现表格校验。在AntD中,表格校验是通过自定义校验规则和使用校验器函数来实现的。 首先,我们需要创建一个自定义的校验规则对象。可以使用AntD提供的`Validators`来创建一个规则对象,例如: ```javascript import { Validators } from 'ant-design-vue'; const customValidationRule = Validators.pattern(/\d+/); ``` 上述代码创建了一个校验规则对象,该规则会检查输入值是否匹配正则表达式`/\d+/`,即是否为数字。 接下来,我们需要在表格的列定义中使用该校验规则。在AntD的Table组件的columns属性中,我们可以使用`scopedSlots`来自定义列的渲染方式。在这里,我们可以使用`edit`字段来实现可编辑的单元格,并应用校验规则。 ```javascript const columns = [ { title: '姓名', dataIndex: 'name', scopedSlots: { customRender: 'name', edit: (text, record, index) => { return ( <a-input v-decorator={['name', { rules: [{ validator: customValidationRule }] }]} placeholder='请输入姓名' /> ) } } }, // 其他列... ]; ``` 上述代码中的`v-decorator`用于绑定校验规则,`rules`属性用于指定校验规则对象。此处我们使用了之前创建的`customValidationRule`规则。在用户输入时,AntD会自动校验输入是否符合规则。 最后,我们需要对整个表单使用AntD的`Form`组件进校验。在提交表单时,使用`form.validateFields`方法来手动校验所有字段。 ```javascript <template> <a-form @submit="handleSubmit"> <a-table :columns="columns" :dataSource="data"> <span slot='name' slot-scope='text, record, index'> {{ record.name }} </span> </a-table> <a-button type='primary' html-type='submit'>提交</a-button> </a-form> </template> <script> export default { // ... methods: { handleSubmit() { this.$refs.form.validateFields((errors, values) => { if (errors) { console.log('表格校验未通过'); return; } console.log('表格校验通过'); console.log(values); // 处理表单数据 }); }, }, } </script> ``` 上述代码中的`validateFields`方法会遍历表单中所有绑定校验规则的字段,并进校验。如果校验未通过,则会通过`errors`参数返回错误信息。如果校验通过,则`values`参数会返回表格中所有的字段值。 这就是AntD中实现表格校验的方法。我们只需要定义校验规则、在列定义中应用规则,并在提交时对整个表单进校验。这样可以有效地实现表格中输入值的校验。 ### 回答3: ant-design-vue 是一个基于 Vue.js 的 UI 组件库,提供了丰富的组件用于开发界面。在 ant-design-vue 中,表格校验是一个常见的需求。 在 ant-design-vue表格组件中,我们可以通过配置校验规则来实现表格校验。首先,我们需要为表格的列定义校验规则。可以使用 `customRender` 属性来自定义渲染表格单元格的内容,并在自定义的渲染函数中添加校验规则。 当我们需要对单元格的内容校验时,可以使用内置的校验规则,例如,`required` 表示必填项,`min` 和 `max` 表示最小值和最大值。如果内置的校验规则不能满足需求,我们还可以自定义校验规则。 在校验规则中,我们可以通过 `validator` 属性来指定校验函数。校验函数接收三个参数:`rule`,`value` 和 `callback`。`rule` 表示当前的校验规则,`value` 表示当前单元格的内容,`callback` 用于异步校验。我们可以在校验函数中判断 `value` 是否满足规则,并通过调用 `callback` 返回校验结果。 在校验函数中,如果发现校验失败,可以通过 `callback` 返回一个错误信息,这样 ant-design-vue 会自动显示错误提示,并阻止表格单元格内容的修改。 总的来说,ant-design-vue 提供了丰富的表格校验功能,可以通过配置校验规则和自定义校验函数来实现表格数据的校验。这样可以有效地提高数据的准确性和完整性,为用户提供更好的交互体验。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值