@arco-design/web-react
Version:
Arco Design React UI Library.
705 lines (704 loc) • 24.3 kB
TypeScript
import React, { ReactNode, CSSProperties } from 'react';
import { PaginationProps } from '../Pagination/pagination';
import { SpinProps } from '../Spin';
import { TriggerProps } from '../Trigger';
import { TooltipProps } from '../Tooltip';
import { AvailableVirtualListProps, VirtualListHandle } from '../_class/VirtualList';
export declare type RowCallbackProps = {
onClick?: (event: any) => void;
onDoubleClick?: (event: any) => void;
onContextMenu?: (event: any) => void;
onMouseEnter?: (event: any) => void;
onMouseLeave?: (event: any) => void;
onHandleSave?: (row: any) => void;
[name: string]: any;
};
export declare type SorterFn = (a: any, b: any) => number;
/**
* @title Table
*/
export interface TableProps<T = any> {
style?: CSSProperties;
className?: string | string[];
/**
* @zh 表格的 `table-layout` 属性设置为 `fixed`,设置为 `fixed` 后,表格的宽度不会被内容撑开超出 100%。
* @en The table's `table-layout` property is set to `fixed`. After set to `fixed`, the width of the table will not be stretched by the content beyond 100%.
*/
tableLayoutFixed?: boolean;
/**
* @zh 表格行 key 的取值字段
* @en Table row key
* @defaultValue key
*/
rowKey?: React.Key | ((record: T) => React.Key);
/**
* @zh 列描述数据对象的数组
* @en An array of column objects
*/
columns?: ColumnProps<T>[];
/**
* @zh 覆盖原生表格标签
* @en Override native table tag
*/
components?: ComponentsProps;
/**
* @zh 表格数据
* @en Data record array to be displayed
*/
data?: T[];
/**
* @zh 边框设置
* @en Configure border
* @defaultValue true
*/
border?: boolean | {
wrapper?: boolean;
headerCell?: boolean;
bodyCell?: boolean;
cell?: boolean;
};
/**
* @zh 是否显示单元格边框,作用等同于 `border={{ cell: true }}`
* @en Whether to display the table cell border, equivalent to `border={{ cell: true }}`
*/
borderCell?: boolean;
/**
* @zh 是否开启鼠标悬浮效果
* @en Whether to enable the hover style
* @defaultValue true
*/
hover?: boolean;
/**
* @zh 默认展开所有可展开的行
* @en Expand all expandable rows by default
*/
defaultExpandAllRows?: boolean;
/**
* @zh 展开的行(受控)
* @en To set expanded rows.
*/
expandedRowKeys?: (string | number)[];
/**
* @zh 默认展开的行
* @en To set default expanded rows
*/
defaultExpandedRowKeys?: (string | number)[];
/**
* @zh 点击展开额外的行,渲染函数。返回值为 `null` 时,不会渲染展开按钮
* @en Click to expand additional rows, rendering functions. When the return value is `null`, the expand button will not be rendered
*/
expandedRowRender?: (record: T, index: number) => ReactNode;
/**
* @zh 自定义展开/关闭列的图标,宽度,标题,具体用法看[这个例子](/react/components/table#定制展开参数)
* @en Customize the icon, width, and title of the expandable column, see [this example](/react/components/table#custom expand parameters) for usage
*/
expandProps?: ExpandProps<T>;
/**
* @zh 点击展开的回调
* @en Callback when click to expand
*/
onExpand?: (record: T, expanded: boolean) => void;
/**
* @zh 点击展开时触发,参数为展开行数组
* @en Callback when expanded button is clicked, the parameter is an array of expanded rows
*/
onExpandedRowsChange?: (expandedRows: (string | number)[]) => void;
/**
* @zh 表格是否在加载中
* @en Whether the table is in loading
*/
loading?: boolean | SpinProps;
/**
* @zh 没有数据的时候显示的元素
* @en Element to be displayed when there is no data
*/
noDataElement?: string | ReactNode;
/**
* @zh 是否显示表头
* @en Whether to show the header
* @defaultValue true
*/
showHeader?: boolean;
/**
* @zh
* 表头是否显示下一次排序的 tooltip 提示。可以设置对象,可以传 `Tooltip` 组件的所有参数。
* @en
* Whether the header shows the tooltip for the next sorting. The object can be set,
* and all the parameters of the `Tooltip` component can be passed.
* @version 2.19.0
* @defaultValue true
*/
showSorterTooltip?: boolean | TooltipProps;
/**
* @zh 是否开启斑马纹
* @en Whether to show stripe style
*/
stripe?: boolean;
/**
* @zh 表格尺寸,分为 默认,`默认` `中` `小` `迷你` 四个尺寸
* @en The table size is divided into four sizes, `default` `medium` `small` `mini`
*/
size?: 'default' | 'middle' | 'small' | 'mini';
/**
* @zh 分页、排序、筛选时的回调
* @en Callback when pagination, sorting, and filtering changes
* @version extra in `2.19.0`, currentAllData in 2.53.0
*/
onChange?: (pagination: PaginationProps, sorter: SorterInfo | SorterInfo[], filters: Partial<Record<keyof T, string[]>>, extra: {
currentData: T[];
currentAllData: T[];
action: 'paginate' | 'sort' | 'filter';
}) => void;
/**
* @zh 分页器设置,参考[Pagination组件](/react/components/pagination),设置 `false` 不展示分页
* @en Pagination settings, refer to [Pagination components](/react/components/pagination), set `false` to hide pagination
*/
pagination?: PaginationProps | boolean;
/**
* @zh 自定义分页渲染。
* @en Customized pagination render
* @version 2.11.0
*/
renderPagination?: (paginationNode?: ReactNode) => ReactNode;
/**
* @zh
* 设置x轴或y轴的滚动。`x` 设置为 `true`,会给 table 添加 `table-layout: fixed` 以及给父元素添加 `overflow: auto`。
* `y` 设置为 `true`,表头和表身会分离,放在两个 table 中
* @en
* Set the scroll of x-axis or y-axis. Setting `x` to `true` will add `table-layout: fixed` to the table and `overflow: auto` to the parent element.
* If `y` is set to `true`, the header and body will be separated and placed in two tables
*/
scroll?: {
x?: number | string | boolean;
y?: number | string | boolean;
};
/**
* @zh 表格行的类名
* @en ClassName of table row
*/
rowClassName?: (record: T, index: number) => string;
/**
* @zh 设置表格行是否可选,选中事件等。[配置项](#rowselection)
* @en Set whether the table row is selectable, select event, etc. [Configuration item](#rowselection)
*/
rowSelection?: RowSelectionProps<T>;
/**
* @zh 设置表头行单元格的各项事件回调
* @en Set the event callback of the header row
*/
onHeaderRow?: (columns: ColumnProps<T>[], index: number) => RowCallbackProps;
/**
* @zh 设置表格行的各项事件回调
* @en Set the event callback of the table row
*/
onRow?: (record: T, index: number) => RowCallbackProps;
prefixCls?: string;
/**
* @zh 当单元格内容为空时,显示占位符,优先级低于 `column.placeholder`。
* @en When the cell content is empty, a placeholder is displayed, and the priority is lower than `column.placeholder`.
* @version 2.23.0
*/
placeholder?: ReactNode;
/**
* @zh 设置分页器的位置,有六个方位 `右下` `左下` `右上` `左上` `上中` `下中`
* @en Set the position of the pagination, there are six positions `bottom right` `bottom left` `top right` `top left` `top center` `bottom center`
* @defaultValue br
*/
pagePosition?: 'br' | 'bl' | 'tr' | 'tl' | 'topCenter' | 'bottomCenter';
/**
* @zh 树形数据在 `data` 中的字段名,默认是 `children`
* @en The field name of the tree data in `data`, default is `children`
* @defaultValue children
*/
childrenColumnName?: string;
/**
* @zh 树形数据每个层级向左偏移的像素
* @en The pixel offset to the left of each level of the tree data
* @defaultValue 15
*/
indentSize?: number;
/**
* @zh 表格尾部
* @en The footer of the table
*/
footer?: (currentPageDate: any) => ReactNode;
/**
* @zh
* 表格开启虚拟滚动,用于处理大数据场景。( 注意:虚拟滚动会自动关闭对树形数据的支持 )
* @en
* The table enables virtual scrolling for processing big data scenarios.
* (Note: Virtual scrolling will automatically turn off support for tree data)
*/
virtualized?: boolean;
/**
* @zh
* 用于配置虚拟滚动。
* @en
* Used to configure `VirtualList`.
* @version 2.46.0
*/
virtualListProps?: AvailableVirtualListProps;
/**
* @zh 总结栏
* @en Table Summary
* @version 2.17.0
*/
summary?: (currentData?: T[]) => ReactNode;
}
/**
* @title RowSelection
*
* @zh `<Table>` 参数 `rowSelection` 的详细参数。
* @en The detailed parameters of `rowSelection`.
*/
export interface RowSelectionProps<T = any> {
/**
* @zh 多选模式下是否开启全选功能
* @en Whether to show check all button
*/
checkAll?: boolean;
/**
* @zh 设置为 `false` 的时候父子选择会自动关联。
* @en When set to `false`, parent-child selections are automatically associated.
* @version 2.33.0
* @defaultValue true
*/
checkStrictly?: boolean;
/**
* @zh 多选模式下的复选框是否跨分页,只在非受控模式下生效。配合 preserveSelectedRowKeys: true 使用,可在受控模式下生效。
* @en Whether the checkboxes in multi-select mode cross pages, only works in uncontrolled mode, but also works in controlled mode with preserveSelectedRowKeys: true.
*/
checkCrossPage?: boolean;
/**
* @zh 自定义列表选择的标题
* @en Customize the title of the selection column
*/
columnTitle?: string | ReactNode;
/**
* @zh 选择框列的宽度
* @en The width of the selection column
*/
columnWidth?: number;
/**
* @zh 选择框的属性配置
* @en Configure the selection checkbox
*/
checkboxProps?: (record: T) => {
[key: string]: any;
};
/**
* @zh 是否固定选择列到左边
* @en Whether to fix column to the left
*/
fixed?: boolean;
/**
* @zh 单选或多选的选中项发生改变时的回调
* @en Callback when the checkbox/radio changes
*/
onChange?: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;
/**
* @zh 用户手动选择/取消选择的回调
* @en Callback for user manual selection/deselection
* @version 2.22.0
*/
onSelect?: (selected: boolean, record: T, selectedRows: T[]) => void;
/**
* @zh 用户手动选择/取消选择所有行的回调
* @en Callback when the user to manually select/deselect all rows
* @version 2.6.0
*/
onSelectAll?: (selected: boolean, selectedRows: any) => void;
/**
* @zh 在数据项被删除时仍然保留选项的 `key`
* @en The `key` is still retained in `selectedRowKeys` when the data item is deleted
* @version 2.19.0
*/
preserveSelectedRowKeys?: boolean;
/**
* @zh 定制复选框,用法与 `column.render` 相同。
* @en Customize checkbox, the usage is same as `column.render`.
* @version 2.19.0
*/
renderCell?: (originNode: any, checked: boolean, record: T) => ReactNode;
/**
* @zh Table选中的项,(受控模式,需要跟 `onChange` 配合使用)
* @en Table selected row, (controlled mode, need to be used with `onChange`)
*/
selectedRowKeys?: (string | number)[];
/**
* @zh 多选或者单选
* @en Multi-select or single-select
*/
type?: 'checkbox' | 'radio';
pureKeys?: boolean;
}
/**
* @title ExpandProps
*
* @zh `<Table>` 参数 `expandProps` 的详细参数。
* @en The detailed parameters of `expandProps`.
*/
export interface ExpandProps<T = any> {
/**
* @zh 定制展开按钮的图标
* @en Customize the icon of the expand button
*/
icon?: (props: {
expanded: boolean;
record: Record<string, any>;
}) => ReactNode;
/**
* @zh 展开按钮列的宽度
* @en The width of expand icon column
*/
width?: number;
/**
* @zh 展开按钮列的表头标题
* @en The table header title of expand icon column
*/
columnTitle?: ReactNode;
/**
* @zh
* 是否允许行展开。如果不指定该参数,会以 expandedRowRender 是否有返回值决定。当出现性能问题时,建议使用 rowExpandable。
* @en
* Whether to allow row expansion. If this parameter is not specified,
* it will be determined by whether expandedRowRender has a return value. When performance problems occur, rowExpandable is recommended.
* @version 2.16.0
*/
rowExpandable?: (record: T) => boolean;
/**
* @zh 支持通过点击行来展开
* @en Clicking on the row to expand
* @version 2.19.0
*/
expandRowByClick?: boolean;
/**
* @zh 树形数据时,只有 `children` 是数组且长度大于 1 才显示展开图标。
* @en For tree data, only when `children` is an array and the length is greater than 1, the expand icon will be displayed.
* @defaultValue true
* @version 2.27.0
*/
strictTreeData?: boolean;
}
/**
* @title Column
*
* @zh 列描述数据对象,是 `columns` 中的一项。
* @en The column describes the data object and is an item in `columns`.
*/
export interface ColumnProps<T = any> {
/**
* @zh 列的类名
* @en ClassName of the column
*/
className?: string | string[];
/**
* @zh 设置列的对齐方式
* @en Set the alignment of the column
* @defaultValue left
*/
align?: 'left' | 'center' | 'right';
/**
* @zh
* 单元格内容超出长度后,是否自动省略,显示 `...`。设置这个属性后,table 的 `table-layout` 将自动变成 `fixed`。
* @en
* If the cell content exceeds the length, whether it is automatically omitted and displays `...`.
* After setting this property, the `table-layout` of the table will automatically become `fixed`.
*/
ellipsis?: boolean;
/**
* @zh 表头单元格自定义样式
* @en Table header cell style
*/
headerCellStyle?: CSSProperties;
/**
* @zh 表身单元格自定义样式
* @en Table body cell style
*/
bodyCellStyle?: CSSProperties;
cellStyle?: CSSProperties;
/**
* @zh 列标题
* @en Column title
*/
title: React.ReactNode;
/**
* @zh 列宽度
* @en Column width
*/
width?: number | string;
/**
* @zh
* 列数据在数据项中对应的 `key`,用于取值显示,支持 `a[0].b.c[1]` 的嵌套写法,
* 详情看 [lodash.get](https://www.npmjs.com/package/lodash.get)。
* @en
* The `key` corresponding to the column data in the data item is used to display the value.
* It supports the nested writing of `a[0].bc[1]`, see [lodash.get](https:// www.npmjs.com/package/lodash.get).
*/
dataIndex?: string;
/**
* @zh React的 key值,如果不指定,默认取 `dataIndex` 的值
* @en React key value, if not specified, the default value of `dataIndex` is taken
*/
key?: string | number;
/**
* @zh 自定义单元格显示的内容
* @en Customize the content displayed in the cell
*/
render?: (col: any, item: T, index: number) => any;
/**
* @zh 当单元格内容为空时,显示占位符,优先级低于 `render`。
* @en When the cell content is empty, a placeholder is displayed, and the priority is lower than `render`.
* @version 2.22.0
*/
placeholder?: ReactNode;
/**
* @zh 排序函数,如果想要服务端排序或者添加更多自定义操作,设置为true,利用`onChange`函数进行自定义排序
* @en Sorting function, if you want server-side sorting or adding more custom operations, set to true and use the `onChange` function for custom sorting
*/
sorter?: SorterFn | boolean | {
compare?: SorterFn;
multiple?: number;
};
/**
* @zh 筛选项,需要配合 `onFilter` 或者 `onChange` 使用
* @en Filter items, need to be used with `onFilter` or `onChange`
* @defaultValue []
*/
filters?: {
text?: ReactNode;
value?: any;
[key: string]: any;
}[];
/**
* @zh 默认筛选条件
* @en To set default filters
*/
defaultFilters?: string[];
/**
* @zh 默认排序方式
* @en To set default sort order
*/
defaultSortOrder?: 'ascend' | 'descend';
/**
* @zh 筛选的受控属性,值为筛选的 value 数组
* @en To set filtered value, the value is the filtered value array
*/
filteredValue?: string[];
/**
* @zh 排序的受控属性,可以控制列的排序,可设置为 `ascend` `descend`
* @en To set sort order, which can control the sorting of columns, can be set to `ascend` `descend`
*/
sortOrder?: 'ascend' | 'descend';
/**
* @zh 支持的排序方式。
* @en Supported sorting methods.
* @defaultValue ['ascend','descend']
*/
sortDirections?: Array<'ascend' | 'descend'>;
/**
* @zh 是否可以筛选多项
* @en Is it possible to filter multiple items
* @defaultValue true
*/
filterMultiple?: boolean;
/**
* @zh 自定义筛选图标。
* @en Custom filter icon.
*/
filterIcon?: ReactNode;
/**
* @zh 自定义筛选框。
* @en Custom filter popup box.
*/
filterDropdown?: (props: {
filterKeys?: string[];
setFilterKeys?: (filterKeys: string[], callback?: Function) => void;
confirm?: Function;
}) => ReactNode;
/**
* @zh 配置筛选弹出框的一些属性。
* @en Configure properties of the filter popup box.
*/
filterDropdownProps?: {
triggerProps?: TriggerProps;
};
/**
* @zh 筛选框打开关闭的回调
* @en Callback when the visible of filter popup changes
*/
onFilterDropdownVisibleChange?: (visible: boolean) => void;
/**
* @zh 筛选函数,配合`filters`
* @en Callback when filter changes
*/
onFilter?: (value: any, row: any) => any;
/**
* @zh 固定头和列到左边或者右边
* @en Fixed header and column to the left or right
*/
fixed?: 'left' | 'right';
/**
* @zh 设置头部单元格的各项事件回调
* @en Set the event callback of the table head cell
*/
onHeaderCell?: (column: any, index: any) => RowCallbackProps;
/**
* @zh 设置表身单元格的各项事件回调
* @en Set the event callback of the table body cell
*/
onCell?: (record: any, index: any) => RowCallbackProps;
children?: ColumnProps<T>[];
rowSpan?: number;
colSpan?: number;
headerCellProps?: RowCallbackProps;
editable?: boolean;
prefixCls?: string;
currentFilters?: {
[key: string]: any;
};
components?: ComponentsProps;
columnFixedStyle?: CSSProperties;
column?: any;
[key: string]: any;
}
export declare type InternalColumnProps<T = any> = ColumnProps<T> & {
$$isOperation?: boolean;
$$isFirstColumn?: boolean;
$$columnIndex?: number | number[];
node?: ReactNode;
};
export interface ColumnComponentProps<T = any> extends ColumnProps<T> {
onSort: (direction: string | undefined, field: string | number) => void;
onHandleFilter: (column: Record<string, any>, filter: Record<string, any>) => void;
onHandleFilterReset: (column: {
[key: string]: any;
}) => void;
currentSorter?: SorterInfo;
currentFilter?: {
[key: string]: any;
};
_key?: string | number;
showSorterTooltip?: boolean | TooltipProps;
index?: number;
}
export declare type ComponentsProps = {
table?: any;
header?: {
operations?: (nodes: {
selectionNode?: ReactNode;
expandNode?: ReactNode;
}) => {
name?: string;
node?: ReactNode;
width?: number;
}[];
wrapper?: any;
thead?: any;
row?: any;
th?: any;
cell?: any;
};
body?: {
operations?: (nodes: {
selectionNode?: ReactNode;
expandNode?: ReactNode;
}) => {
name?: string;
node?: ReactNode | ((record: any) => ReactNode);
width?: number;
}[];
wrapper?: any;
tbody?: any;
row?: any;
td?: any;
cell?: any;
};
};
export interface TheadProps<T = any> {
expandedRowRender?: (record: {
[key: string]: any;
}, index: number) => ReactNode;
onCheckAll: (_: any, e: any) => void;
onSort: (direction: any, field: any) => void;
data: T[];
onHandleFilter: (column: any, filter: any) => void;
onHandleFilterReset: (filter: any) => void;
currentSorter: SorterInfo;
activeSorters: SorterInfo[];
selectedRowKeys: (string | number)[];
onHeaderRow?: (columns: any, index: number) => RowCallbackProps;
prefixCls?: string;
rowSelection?: RowSelectionProps;
columnTitle?: string | ReactNode;
currentFilters?: Partial<Record<keyof T, string[]>>;
rowKey?: TableProps['rowKey'];
components?: ComponentsProps;
expandProps?: ExpandProps<T>;
allSelectedRowKeys?: (string | number)[];
groupColumns?: InternalColumnProps<T>[][];
stickyOffsets?: number[];
groupStickyClassNames?: string[][];
showSorterTooltip?: boolean | TooltipProps;
}
export declare type GetRowKeyType<T> = (record: T) => string;
export interface TbodyProps<T = any> {
data: T[];
selectedRowKeys: React.Key[];
indeterminateKeys: React.Key[];
components?: ComponentsProps;
expandedRowKeys: React.Key[];
columns: InternalColumnProps<T>[];
noDataElement?: string | ReactNode;
onCheck: (checked: boolean, record: any) => void;
onCheckRadio: (key: any, record: any) => void;
onClickExpandBtn: (key: React.Key) => void;
pagination?: PaginationProps | boolean;
scroll?: {
x?: number | string | boolean;
y?: number | string | boolean;
};
expandedRowRender?: (record: T, index: number) => ReactNode;
rowClassName?: (record: T, index: number) => string;
onRow?: (record: T, index: number) => RowCallbackProps;
prefixCls?: string;
rowSelection?: RowSelectionProps<T>;
expandProps?: ExpandProps<T>;
childrenColumnName?: string;
indentSize?: number;
hasFixedColumn?: boolean;
tableViewWidth?: number;
currentSorter?: SorterInfo;
activeSorters?: SorterInfo[];
virtualized?: boolean;
virtualListProps?: AvailableVirtualListProps;
stickyOffsets?: number[];
stickyClassNames?: string[];
getRowKey?: GetRowKeyType<T>;
placeholder?: ReactNode;
saveVirtualListRef?: (ref: VirtualListHandle) => void;
saveRef?: (ref: HTMLElement | HTMLDivElement) => void;
}
export interface TfootProps<T = any> {
prefixCls?: string;
summary?: (currentData?: T[]) => ReactNode;
data?: T[];
columns?: InternalColumnProps<T>[];
stickyOffsets?: number[];
stickyClassNames?: string[];
}
export declare type SortDirection = 'descend' | 'ascend';
export interface SorterResult {
direction?: SortDirection;
field?: string;
}
export interface SorterInfo {
direction?: SortDirection;
field?: string | number;
sorterFn?: SorterFn;
priority?: number;
}
export interface SummaryProps {
fixed?: 'top' | 'bottom';
children?: ReactNode;
}