react使用antdesign中table组件时,如何实现单元格动态合并?

1. 首先要对后台返回的表格数据排序,把需要合并的相同的字段排在一起。这一步一般后台会处理好。

2. 在表格组件中创建一个temp对象,用来存放已经合并的字段。

3. 新建一个方法mergecells,在方法遍历数据,相同的字段累计加1,遍历之后返回重复次数。

4. 在表格的columns数据中使用mergecells方法,详情看下列代码。

 1 import React, { Component } from 'react'
 2 import { Table, Icon } from 'antd'
 3 import pagination from 'src/components/pagination'
 4 
 5 class TableList extends Component {
 6   
 7   render () {
 8     const temp = {} // 当前重复的值,支持多列
 9     /**
10      * 动态合并表格方法
11      * @param {*} text 表格每列对应的值
12      * @param {*} data 后台返回的展示数据数组, 数据需要按字段排序
13      * @param {*} columns 表格每列表头字段
14      */
15     const mergeCells = (text, data, columns) => {
16       let i = 0 
17       if (text !== temp[columns]){
18         temp[columns] = text
19         data.forEach(((item) => {
20           if (item[columns] === temp[columns]){
21             i += 1
22           }
23         }))
24       }
25       return i
26     }
27     const renderContent = (value, row, index) => {
28       const obj = {
29         children: value,
30         props: {},
31       }
32       return obj
33     }
34     const columns = [
35       {
36         title: '序号',
37         dataIndex: 'serialNumber',
38         render: renderContent,
39       },
40       {
41         title: '渠道一',
42         dataIndex: 'firstClassBrand',
43         render: (value, row, index) => {
44           const obj = {
45             children: value,
46             props: {},
47           }
48           obj.props.rowSpan = mergeCells(row.firstClassBrand, this.props.data, 'firstClassBrand')
49           return obj
50         },
51       },
52       {
53         title: '渠道二',
54         dataIndex: 'twoTierBrand',
55         render: (value, row, index) => {
56           const obj = {
57             children: value,
58             props: {}
59           }
60           obj.props.rowSpan = mergeCells(row.twoTierBrand, this.props.data, 'twoTierBrand')
61           return obj
62         },
63       }
64     ]
65     return(
66       <Table columns={columns} dataSource={this.props.data} pagination={pagination({ total: 100 })} bordered />
67     )
68   }
69 }
70 
71 export default TableList