效果:

話不多說,直接上代碼: 【不知道從哪搜羅來的改了改】
// 處理數據
const getData = list => {
// 刪除所有children
list.forEach(item => {
delete item.children;
});
// 將數據存儲為 以 id 為 KEY 的 map 索引數據列
const map = {};
list.forEach(item => {
map[item.id] = item;
});
const newList = [];
list.forEach(item => {
// 以當前遍歷項的pid,去map對象中找到索引的id
const parent = map[item.parentTaskId];
// 如果找到索引,那么說明此項不在頂級當中,那么需要把此項添加到他對應的父級中
if (parent) {
(parent.children || (parent.children = [])).push(item);
} else {
// 如果沒有在map中找到對應的索引ID,那么直接把當前的item添加到 val結果集中,作為頂級
newList.push(item);
}
});
return newList;
};
<Table
loading={loading}
defaultExpandAllRows
columns={columns}
rowKey="id"
dataSource={data}
pagination={false}
/>
ps:因為有一個標題過長需要隱藏的需求,所以column這邊需要再做樣式處理:
{
title: '任務名稱',
dataIndex: 'taskName',
key: 'taskName',
width: '30%',
render: (text, record) => (
<div
style={{
display: 'inline-block',
width: '70%',
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
verticalAlign: ' text-bottom'
}}
>
<span
title={record.taskName}
style={{ color: '#ffa808', cursor: 'pointer' }}
onClick={() => {
router.push({
pathname: '/personal/work/taskdetail',
query: {
id: record.id,
activeKey: 'detailMsg'
}
});
}}
>
{record.taskName}
</span>
</div>
)
},
這樣既不會影響前面的icon同一行展示,也不會換行啦
