Ant Design之表格动态合并行

在web开发中,表格的行合并是一个很常见的需求。antd也提供了这种功能,但是文档中的示例代码却和我想象中的相差甚远,如下所示,它是通过一种很笨的办法实现的行合并。这样当表格的数据源是动态获取的,我们就没有办法动态的合并行。

官方代码

蚂蚁框架的官方文档代码,我的代码见最后


import { Table } from 'antd';

// In the fifth row, other columns are merged into first column
// by setting it's colSpan to be 0
const renderContent = (value, row, index) => {
  const obj = {
    children: value,
    props: {},
  };
  if (index === 4) {
    obj.props.colSpan = 0;
  }
  return obj;
};

const columns = [{
  title: 'Name',
  dataIndex: 'name',
  render: (text, row, index) => {
    if (index < 4) {
      return <a href="javascript:;">{text}</a>;
    }
    return {
      children: <a href="javascript:;">{text}</a>,
      props: {
        colSpan: 5,
      },
  
Ant Design Vue 表格组件提供了 `spanMethod` 属性来实现单元格合并,你可以在该属性中指定一个回调函数来返回当前单元格是否需要合并,以及合并数和列数。 下面是一个示例代码: ```html <template> <a-table :columns="columns" :data-source="data" :row-key="record => record.key" :scroll="{ x: 'max-content' }"> <template #name="{ text, record, index }"> <span v-if="index === 0 || record.name !== data[index - 1].name">{{ text }}</span> </template> <template #age="{ text, record, index }"> <span v-if="index === 0 || record.name !== data[index - 1].name" :rowspan="getSpan('name', record.name)">{{ text }}</span> </template> <template #address="{ text, record, index }"> <span v-if="index === 0 || record.name !== data[index - 1].name" :rowspan="getSpan('name', record.name)" :colspan="getSpan('address', record.address)">{{ text }}</span> </template> </a-table> </template> <script> export default { data() { return { data: [ { key: '1', name: 'John Brown', age: 32, address: 'New York No. 1 Lake Park' }, { key: '2', name: 'Jim Green', age: 40, address: 'London No. 1 Lake Park' }, { key: '3', name: 'Joe Black', age: 32, address: 'Sidney No. 1 Lake Park' }, { key: '4', name: 'John Brown', age: 32, address: 'New York No. 2 Lake Park' }, { key: '5', name: 'Jim Green', age: 40, address: 'London No. 2 Lake Park' }, { key: '6', name: 'Joe Black', age: 32, address: 'Sidney No. 2 Lake Park' }, ], columns: [ { title: 'Name', dataIndex: 'name', key: 'name', slots: { customRender: 'name' }, }, { title: 'Age', dataIndex: 'age', key: 'age', slots: { customRender: 'age' }, }, { title: 'Address', dataIndex: 'address', key: 'address', slots: { customRender: 'address' }, }, ], nameSpanMap: {}, addressSpanMap: {}, }; }, methods: { getSpan(columnKey, text) { const spanMap = columnKey === 'name' ? this.nameSpanMap : this.addressSpanMap; if (!spanMap[text]) { spanMap[text] = 1; return 1; } const span = spanMap[text]; spanMap[text] = span + 1; return 0; }, }, }; </script> ``` 在上面的代码中,我们通过 `template` 标签指定了每一列的渲染方式,同时在 `spanMethod` 属性中指定了回调函数 `getSpan`。在该函数中,我们通过维护一个以列名和单元格文本为键的 Map 来计算每一个单元格需要合并数和列数,并返回给表格组件。最终,我们通过 `rowspan` 和 `colspan` 属性来指定合并数和列数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值