Skip to content

Commit 369fa95

Browse files
authoredMar 17, 2022
feat(Table): Table 新增树形数据结构展示功能 #539 (#686)
1 parent dacf2a8 commit 369fa95

File tree

6 files changed

+62
-20
lines changed

6 files changed

+62
-20
lines changed
 

‎packages/react-table/README.md

+12-1
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,16 @@ const dataSource = [
773773
age: '10',
774774
id: '1-1',
775775
children: [
776-
{ name: '邓紫棋-0-1-1', age: '10', id: '1-1-1',},
776+
{
777+
name: '邓紫棋-0-1-1',
778+
age: '10',
779+
id: '1-1-1',
780+
children: [
781+
{name: '邓紫棋-0-1-1-1', age: '10', id: '-0-1-1-1'},
782+
{name: '邓紫棋-0-1-1-2', age: '10', id: '-0-1-1-2'},
783+
{name: '邓紫棋-0-1-1-3', age: '10', id: '-0-1-1-3'},
784+
]
785+
},
777786
{ name: '邓紫棋-0-1-2', age: '10', id: '1-1-2',}
778787
]
779788
},
@@ -834,6 +843,8 @@ ReactDOM.render(<Demo />, _mount_);
834843
| colSpan | 合并表头行。| Number | - |
835844
| ellipsis | 超过宽度将自动省略。`v4.8.7+`| Boolean | `false` |
836845
| render | 生成复杂数据的渲染函数,参数分别为当前行的值,当前值的 `key`,行索引数据,当前行号,当前列号。| `Function(text, key, rowData, rowNumber, columnNumber)` | - |
846+
| align | 设置列的对齐方式 | "left"|"center"|"right" | - |
847+
| className | 列样式类名 | string | - |
837848

838849
### expandable
839850

‎packages/react-table/src/TableTr.tsx

+29-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useMemo, useState } from 'react';
1+
import React, { useMemo, useState, useEffect } from 'react';
22
import Icon from '@uiw/react-icon';
33
import { TableProps } from './';
44
import './style/index.less';
@@ -7,7 +7,7 @@ import { noop } from '@uiw/utils';
77
interface TableTrProps<T> {
88
rowKey?: keyof T;
99
data: T[];
10-
keys: string[];
10+
keys: TableProps['columns'];
1111
render: { [key: string]: any };
1212
ellipsis?: Record<string, boolean>;
1313
prefixCls: string;
@@ -34,16 +34,25 @@ export default function TableTr<T extends { [key: string]: any }>(props: TableTr
3434
indentSize,
3535
childrenColumnName,
3636
} = props;
37-
37+
const [isOpacity, setIsOpacity] = useState(false);
3838
const [expandIndex, setExpandIndex] = useState<Array<T[keyof T] | number>>([]);
39+
useEffect(() => {
40+
setIsOpacity(!!data?.find((it) => it[childrenColumnName]));
41+
}, [data]);
3942

4043
const IconDom = useMemo(() => {
4144
return (key: T[keyof T] | number, isOpacity: boolean) => {
4245
const flag = expandIndex.includes(key);
4346
return (
4447
<Icon
4548
type={flag ? 'minus-square-o' : 'plus-square-o'}
46-
style={{ marginRight: 10, opacity: isOpacity ? 1 : 0, marginLeft: hierarchy * indentSize }}
49+
style={{
50+
marginRight: 10,
51+
opacity: isOpacity ? 1 : 0,
52+
marginLeft: hierarchy * indentSize,
53+
float: 'left',
54+
marginTop: 3.24,
55+
}}
4756
onClick={() => {
4857
setExpandIndex(flag ? expandIndex.filter((it) => it !== key) : [...expandIndex, key]);
4958
}}
@@ -61,12 +70,12 @@ export default function TableTr<T extends { [key: string]: any }>(props: TableTr
6170
return (
6271
<React.Fragment key={rowNum}>
6372
<tr key={key}>
64-
{keys.map((keyName, colNum) => {
73+
{keys!.map((keyName, colNum) => {
6574
let objs: React.TdHTMLAttributes<HTMLTableDataCellElement> = {
66-
children: trData[keyName],
75+
children: trData[keyName.key!],
6776
};
68-
if (render[keyName]) {
69-
const child = render[keyName](trData[keyName], keyName, trData, rowNum, colNum);
77+
if (render[keyName.key!]) {
78+
const child = render[keyName.key!](trData[keyName.key!], keyName.key!, trData, rowNum, colNum);
7079
if (React.isValidElement(child)) {
7180
objs.children = child;
7281
} else {
@@ -79,21 +88,29 @@ export default function TableTr<T extends { [key: string]: any }>(props: TableTr
7988
}
8089
}
8190
}
82-
if (ellipsis && ellipsis[keyName]) {
91+
if (ellipsis && ellipsis[keyName.key!]) {
8392
objs.className = `${prefixCls}-ellipsis`;
8493
}
8594
const isHasChildren = Array.isArray(trData[childrenColumnName]);
86-
if (colNum === 0 && (hierarchy || isHasChildren)) {
87-
objs.className = `${objs.className} ${prefixCls}-has-children`;
95+
if (colNum === 0 && (isOpacity || hierarchy || isHasChildren)) {
8896
objs.children = (
8997
<>
9098
{IconDom(key, isHasChildren)}
99+
<span style={{ paddingLeft: hierarchy * indentSize }}></span>
91100
{objs.children}
92101
</>
93102
);
94103
}
95104
return (
96-
<td {...objs} key={colNum} onClick={(evn) => onCell(trData, { rowNum, colNum, keyName }, evn)} />
105+
<td
106+
{...objs}
107+
key={colNum}
108+
// style={keyName?.style}
109+
className={`${objs.className} ${prefixCls}-tr-children-${keyName?.align || 'left'} ${
110+
keyName.className || ''
111+
}`}
112+
onClick={(evn) => onCell(trData, { rowNum, colNum, keyName: keyName.key! }, evn)}
113+
/>
97114
);
98115
})}
99116
</tr>

‎packages/react-table/src/Thead.tsx

+8-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import './style/index.less';
66
export interface TheadProps<T extends { [key: string]: V }, V = any> extends IProps {
77
data?: TableColumns<T>[][];
88
onCellHead?: TableProps<T, V>['onCellHead'];
9+
align?: TableColumns['align'];
10+
className?: TableColumns['className'];
911
}
1012

1113
export default function TheadComponent<T extends { [key: string]: V }, V>(
@@ -29,7 +31,12 @@ export default function TheadComponent<T extends { [key: string]: V }, V>(
2931
thProps.className = `${thProps.className || ''} ${prefixCls}-ellipsis`;
3032
}
3133
return (
32-
<th key={colNum} onClick={(evn) => onCellHead(item, colNum, rowNum!, evn)} {...thProps}>
34+
<th
35+
key={colNum}
36+
{...thProps}
37+
className={`${prefixCls}-tr-children-${item?.align || 'left'} ${className || ''}`}
38+
onClick={(evn) => onCellHead(item, colNum, rowNum!, evn)}
39+
>
3340
{titleNode}
3441
</th>
3542
);

‎packages/react-table/src/index.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ export type TableColumns<T = any> = {
4040
ellipsis?: boolean;
4141
render?: (text: string, keyName: string, rowData: T, rowNumber: number, columnNumber: number) => React.ReactNode;
4242
style?: React.CSSProperties;
43+
align?: 'left' | 'center' | 'right';
44+
className?: string;
4345
[key: string]: any;
4446
};
4547

@@ -137,7 +139,7 @@ export default function Table<T extends { [key: string]: V }, V>(props: TablePro
137139
let keys = getAllColumnsKeys<T>(columns);
138140
let selfColumns: TableColumns<T>[] = [];
139141
if (expandable?.expandedRowRender) {
140-
keys = ['uiw-expanded', ...keys];
142+
keys = [{ key: 'uiw-expanded', align: 'center' }, ...keys];
141143
selfColumns = [
142144
{
143145
title: '',

‎packages/react-table/src/style/index.less

+8-3
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,14 @@
4848
text-overflow: ellipsis;
4949
word-break: keep-all;
5050
}
51-
&-has-children {
52-
display: flex;
53-
align-items: center;
51+
&-tr-children-center {
52+
text-align: center;
53+
}
54+
&-tr-children-left {
55+
text-align: left;
56+
}
57+
&-tr-children-right {
58+
text-align: right;
5459
}
5560
&-bordered {
5661
> table {

‎packages/react-table/src/util.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,12 @@ export function getLevelItems<T>(data: TableColumns<T>[], result?: ILevelItems<T
117117
* Get all columns keys
118118
* @param {Array} data
119119
*/
120-
export function getAllColumnsKeys<T>(data: TableColumns<T>[], keys: any[] = []): string[] {
120+
export function getAllColumnsKeys<T>(data: TableColumns<T>[], keys: TableColumns<T>[] = []): TableColumns<T>[] {
121121
for (let i = 0; i < data.length; i += 1) {
122122
if (data[i].children) {
123123
keys = keys.concat(getAllColumnsKeys(data[i].children || []));
124124
} else if (data[i].key) {
125-
keys.push(data[i].key);
125+
keys.push(data[i]);
126126
}
127127
}
128128
return keys;

0 commit comments

Comments
 (0)
Please sign in to comment.