折腾:
【未解决】剧本编写系统中优化超级管理员的全部剧本统计页
期间,现有的效果是:

需要实现类似于:

的效果,其中表头和中间的单元格,都存在合并单元格的效果
去搞清楚antd pro中如何实现
去看官网文档:
【总结】
目前,可以用如下代码实现带表头的效果的表格了:
src/routes/Admin/AllUserScriptCount.js
import React, { PureComponent, Fragment } from 'react';
import { connect } from 'dva';
import {
Card,
Form,
Table,
} from 'antd';
import { routerRedux } from 'dva/router';
import SimpleTable from 'components/SimpleTable';
import PageHeaderLayout from '../../layouts/PageHeaderLayout';
import styles from '../List/TableList.less';
const { Column, ColumnGroup } = Table;
// @connect(({ script, loading }) => ({
@connect(({ script}) => ({
script,
// loading: loading.models.script,
}))
@Form.create()
export default class AllUserScriptCount extends PureComponent {
state = {
formValues: {},
currentPage: 1,
pageSize: 20,
};
componentDidMount() {
this.props.dispatch({
type: 'script/fetchUserScriptsCount',
});
}
handleStandardTableChange = (pagination) => {
const { dispatch } = this.props;
const { formValues } = this.state;
this.setState({
currentPage: pagination.current,
pageSize: pagination.pageSize,
});
const params = {
page: pagination.current,
page_size: pagination.pageSize,
...formValues,
};
dispatch({
type: 'script/fetchUserScriptsCount',
payload: params,
});
};
handleScriptList = (searchPara) => {
console.log("handleScriptList: searchPara=", searchPara)
const { dispatch } = this.props;
dispatch(routerRedux.push({
pathname: '/script/all-script-list',
// search: `?author_id=${authorId}`,
search: searchPara,
}));
};
// merge `rowCountToMerge` rows start from `startRowIdx`
mergeRows = (value, row, index, rowCountToMerge, startRowIdx, searchPara) => {
console.log(`value=${value}, index=${index}, rowCountToMerge=${rowCountToMerge},startRowIdx=${startRowIdx}, searchPara=${searchPara}`, "row=", row)
const obj = {
// children: value,
children: <a href="javascript:;" onClick={() => this.handleScriptList(searchPara)} >{value}</a>,
props: {},
}
const endRowIdx = startRowIdx + (rowCountToMerge - 1)
if (index === startRowIdx) {
obj.props.rowSpan = rowCountToMerge
} else if ((index >= (startRowIdx+1)) && (index <= endRowIdx)) {
// other row are merged into first row cell
obj.props.rowSpan = 0
}
console.log("obj=", obj)
return obj
}
render() {
const { script: { userScriptsCount }, loading } = this.props;
const { currentPage, pageSize } = this.state;
// const columns = [
// {
// title: '序号',
// dataIndex: 'no',
// rowKey: 'no',
// render(text, record, index) {
// const no = (currentPage - 1) * pageSize
// return no + index + 1;
// },
// },
// {
// title: '用户名',
// dataIndex: 'username',
// rowKey: 'username',
// render: (text, record) => (
// <Fragment>
// <a href="javascript:;" onClick={() => this.handleScriptList(record.user_id)}>{text}</a>
// </Fragment>
// ),
// },
// {
// title: '所有剧本',
// dataIndex: 'all_scripts_count',
// rowKey: 'all_scripts_count',
// },
// {
// title: '已发布剧本数量',
// dataIndex: 'published_scripts_count',
// rowKey: 'published_scripts_count',
// },
// {
// title: '通过率',
// dataIndex: 'published_ratio',
// rowKey: 'published_ratio',
// },
// ];
const columns = [
{
title: '序号',
dataIndex: 'number',
rowKey: 'number',
// render(text, record, index) {
// const number = (currentPage - 1) * pageSize
// return number + index + 1;
// },
},
{
title: '剧本组',
// dataIndex: 'scriptGroup',
rowKey: 'scriptGroup',
children: [
{
title: '组名',
dataIndex: 'groupName',
rowKey: 'groupName',
render: (value, row, index) => {
const searchPara = `?group_id=${row.groupId}`
return this.mergeRows(value, row, index, 3, 0, searchPara)
// console.log(`value=${value}, index=${index}, `, "row=", row)
// const obj = {
// children: value,
// props: {},
// }
// if (index === 0) {
// obj.props.rowSpan = 3
// } else if ((index === 1) || (index === 2)) {
// // These two row are merged into above cell
// obj.props.rowSpan = 0
// }
// console.log("obj=", obj)
// return obj
},
},
{
title: '组长',
dataIndex: 'groupOwner.username',
rowKey: 'groupOwner.username',
render: (value, row, index) => {
const searchPara = `?user_id=${row.groupOwner.id}`
return this.mergeRows(value, row, index, 3, 0, searchPara)
},
},
{
title: '剧本总数',
dataIndex: 'totalScriptCount',
rowKey: 'totalScriptCount',
render: (value, row, index) => {
const searchPara = `?group_id=${row.groupId}`
return this.mergeRows(value, row, index, 3, 0, searchPara)
},
},
],
},
{
title: '组员',
rowKey: 'membersInfo',
dataIndex: 'membersInfo',
children: [
{
title: '用户名',
dataIndex: 'membersInfo.username',
rowKey: 'membersInfo.username',
},
{
title: '剧本总数',
dataIndex: 'membersInfo.totalScriptCount',
rowKey: 'membersInfo.totalScriptCount',
},
{
title: '已通过',
dataIndex: 'membersInfo.publishedScriptCount',
rowKey: 'membersInfo.publishedScriptCount',
},
{
title: '未通过',
dataIndex: 'membersInfo.nonPublishedScriptCount',
rowKey: 'membersInfo.nonPublishedScriptCount',
},
{
title: '通过率',
dataIndex: 'membersInfo.publishedScriptRatio',
rowKey: 'membersInfo.publishedScriptRatio',
},
{
title: '未通过率',
dataIndex: 'membersInfo.nonPublishedScriptRatio',
rowKey: 'membersInfo.nonPublishedScriptRatio',
},
],
},
]
const data = [
{
key: '1',
number: 1,
groupId: "5",
groupName: 'Maggie剧本组',
groupOwner: {
"id": "78c7b3c48a7c4f1f96cedc469fedad40",
"username": 'Maggie',
},
totalScriptCount: 248,
membersInfo : {
'username': 'Maggie',
'totalScriptCount': 121,
'publishedScriptCount': 121,
'publishedScriptRatio': '100%',
"nonPublishedScriptCount": 0,
'nonPublishedScriptRatio': '0%',
},
},
{
key: '2',
number: 2,
groupId: "5",
groupName: 'Maggie剧本组',
groupOwner: {
"id": "78c7b3c48a7c4f1f96cedc469fedad40",
"username": 'Maggie',
},
totalScriptCount: 248,
membersInfo : {
'username': 'xxx',
'totalScriptCount': 101,
'publishedScriptCount': 101,
'publishedScriptRatio': '100%',
"nonPublishedScriptCount": 0,
'nonPublishedScriptRatio': '0%',
},
},
{
key: '3',
number: 3,
groupId: "5",
groupName: 'Maggie剧本组',
groupOwner: {
"id": "78c7b3c48a7c4f1f96cedc469fedad40",
"username": 'Maggie',
},
totalScriptCount: 248,
membersInfo : {
'username': 'xxx',
'totalScriptCount': 26,
'publishedScriptCount': 26,
'publishedScriptRatio': '0%',
"nonPublishedScriptCount": 0,
'nonPublishedScriptRatio': '100%',
},
},
];
return (
<PageHeaderLayout title="全部用户剧本统计">
<Card bordered={false}>
<div className={styles.tableList}>
{/* <SimpleTable
loading={loading}
data={userScriptsCount}
columns={columns}
/> */}
<Table
bordered
columns={columns}
dataSource={data}
>
{/* <Column
title="序号"
dataIndex="number"
key="number"
/>
<ColumnGroup title="剧本组">
<Column
title="组名"
dataIndex="groupName"
key="groupName"
/>
<Column
title="组长"
dataIndex="groupOwnerName"
key="groupOwnerName"
/>
<Column
title="剧本总数"
dataIndex="totalScriptCount"
key="totalScriptCount"
/>
</ColumnGroup>
<Column
title="Age"
dataIndex="age"
key="age"
/>
<Column
title="Address"
dataIndex="address"
key="address"
/> */}
</Table>
</div>
</Card>
</PageHeaderLayout>
);
}
}实现了基本的要的效果:

点击不同按钮后,传递不同参数,进去列表页面:


转载请注明:在路上 » 【已解决】Antd Pro中如何动态自定义生成带合并单元格的表头