diff --git a/packages/react-table/README.md b/packages/react-table/README.md index fd12557402..9e2dab1954 100644 --- a/packages/react-table/README.md +++ b/packages/react-table/README.md @@ -773,7 +773,16 @@ const dataSource = [ age: '10', id: '1-1', children: [ - { name: '邓紫棋-0-1-1', age: '10', id: '1-1-1',}, + { + name: '邓紫棋-0-1-1', + age: '10', + id: '1-1-1', + children: [ + {name: '邓紫棋-0-1-1-1', age: '10', id: '-0-1-1-1'}, + {name: '邓紫棋-0-1-1-2', age: '10', id: '-0-1-1-2'}, + {name: '邓紫棋-0-1-1-3', age: '10', id: '-0-1-1-3'}, + ] + }, { name: '邓紫棋-0-1-2', age: '10', id: '1-1-2',} ] }, @@ -834,6 +843,8 @@ ReactDOM.render(, _mount_); | colSpan | 合并表头行。| Number | - | | ellipsis | 超过宽度将自动省略。`v4.8.7+`| Boolean | `false` | | render | 生成复杂数据的渲染函数,参数分别为当前行的值,当前值的 `key`,行索引数据,当前行号,当前列号。| `Function(text, key, rowData, rowNumber, columnNumber)` | - | +| align | 设置列的对齐方式 | "left"|"center"|"right" | - | +| className | 列样式类名 | string | - | ### expandable diff --git a/packages/react-table/src/TableTr.tsx b/packages/react-table/src/TableTr.tsx index 0e32bece77..2b09e74c04 100644 --- a/packages/react-table/src/TableTr.tsx +++ b/packages/react-table/src/TableTr.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useState } from 'react'; +import React, { useMemo, useState, useEffect } from 'react'; import Icon from '@uiw/react-icon'; import { TableProps } from './'; import './style/index.less'; @@ -7,7 +7,7 @@ import { noop } from '@uiw/utils'; interface TableTrProps { rowKey?: keyof T; data: T[]; - keys: string[]; + keys: TableProps['columns']; render: { [key: string]: any }; ellipsis?: Record; prefixCls: string; @@ -34,8 +34,11 @@ export default function TableTr(props: TableTr indentSize, childrenColumnName, } = props; - + const [isOpacity, setIsOpacity] = useState(false); const [expandIndex, setExpandIndex] = useState>([]); + useEffect(() => { + setIsOpacity(!!data?.find((it) => it[childrenColumnName])); + }, [data]); const IconDom = useMemo(() => { return (key: T[keyof T] | number, isOpacity: boolean) => { @@ -43,7 +46,13 @@ export default function TableTr(props: TableTr return ( { setExpandIndex(flag ? expandIndex.filter((it) => it !== key) : [...expandIndex, key]); }} @@ -61,12 +70,12 @@ export default function TableTr(props: TableTr return ( - {keys.map((keyName, colNum) => { + {keys!.map((keyName, colNum) => { let objs: React.TdHTMLAttributes = { - children: trData[keyName], + children: trData[keyName.key!], }; - if (render[keyName]) { - const child = render[keyName](trData[keyName], keyName, trData, rowNum, colNum); + if (render[keyName.key!]) { + const child = render[keyName.key!](trData[keyName.key!], keyName.key!, trData, rowNum, colNum); if (React.isValidElement(child)) { objs.children = child; } else { @@ -79,21 +88,29 @@ export default function TableTr(props: TableTr } } } - if (ellipsis && ellipsis[keyName]) { + if (ellipsis && ellipsis[keyName.key!]) { objs.className = `${prefixCls}-ellipsis`; } const isHasChildren = Array.isArray(trData[childrenColumnName]); - if (colNum === 0 && (hierarchy || isHasChildren)) { - objs.className = `${objs.className} ${prefixCls}-has-children`; + if (colNum === 0 && (isOpacity || hierarchy || isHasChildren)) { objs.children = ( <> {IconDom(key, isHasChildren)} + {objs.children} ); } return ( - onCell(trData, { rowNum, colNum, keyName }, evn)} /> + onCell(trData, { rowNum, colNum, keyName: keyName.key! }, evn)} + /> ); })} diff --git a/packages/react-table/src/Thead.tsx b/packages/react-table/src/Thead.tsx index 31cab49d81..7af3e644da 100644 --- a/packages/react-table/src/Thead.tsx +++ b/packages/react-table/src/Thead.tsx @@ -6,6 +6,8 @@ import './style/index.less'; export interface TheadProps extends IProps { data?: TableColumns[][]; onCellHead?: TableProps['onCellHead']; + align?: TableColumns['align']; + className?: TableColumns['className']; } export default function TheadComponent( @@ -29,7 +31,12 @@ export default function TheadComponent( thProps.className = `${thProps.className || ''} ${prefixCls}-ellipsis`; } return ( - onCellHead(item, colNum, rowNum!, evn)} {...thProps}> + onCellHead(item, colNum, rowNum!, evn)} + > {titleNode} ); diff --git a/packages/react-table/src/index.tsx b/packages/react-table/src/index.tsx index 9ca34ca989..76854026ab 100644 --- a/packages/react-table/src/index.tsx +++ b/packages/react-table/src/index.tsx @@ -40,6 +40,8 @@ export type TableColumns = { ellipsis?: boolean; render?: (text: string, keyName: string, rowData: T, rowNumber: number, columnNumber: number) => React.ReactNode; style?: React.CSSProperties; + align?: 'left' | 'center' | 'right'; + className?: string; [key: string]: any; }; @@ -137,7 +139,7 @@ export default function Table(props: TablePro let keys = getAllColumnsKeys(columns); let selfColumns: TableColumns[] = []; if (expandable?.expandedRowRender) { - keys = ['uiw-expanded', ...keys]; + keys = [{ key: 'uiw-expanded', align: 'center' }, ...keys]; selfColumns = [ { title: '', diff --git a/packages/react-table/src/style/index.less b/packages/react-table/src/style/index.less index d2952a6495..248103d2f4 100644 --- a/packages/react-table/src/style/index.less +++ b/packages/react-table/src/style/index.less @@ -48,9 +48,14 @@ text-overflow: ellipsis; word-break: keep-all; } - &-has-children { - display: flex; - align-items: center; + &-tr-children-center { + text-align: center; + } + &-tr-children-left { + text-align: left; + } + &-tr-children-right { + text-align: right; } &-bordered { > table { diff --git a/packages/react-table/src/util.ts b/packages/react-table/src/util.ts index 76786d2f84..68a0c8236f 100644 --- a/packages/react-table/src/util.ts +++ b/packages/react-table/src/util.ts @@ -117,12 +117,12 @@ export function getLevelItems(data: TableColumns[], result?: ILevelItems(data: TableColumns[], keys: any[] = []): string[] { +export function getAllColumnsKeys(data: TableColumns[], keys: TableColumns[] = []): TableColumns[] { for (let i = 0; i < data.length; i += 1) { if (data[i].children) { keys = keys.concat(getAllColumnsKeys(data[i].children || [])); } else if (data[i].key) { - keys.push(data[i].key); + keys.push(data[i]); } } return keys;