Table

Table 是一个用于展示数据的表格组件。
Import
import { Table } from '@kubed/components;'
Source
View source code
Docs
Edit this page
npm
@kubed/components

基础用法

详细 react table 使用请参考 react-table

useTable 扩展点

useTable(options)

options.meta

table 中大部分扩展点都是通过 meta 进行配置的。

1
interface TableMeta<TData extends RowData> {
2
tableName: string; // table 名称, 现在仅用于存储状态
3
refetch?: () => void; // 重新获取数据
4
storageStateKeys?: (keyof TableState)[] | '*'; // 需要存储的状态字段, 配合 Status2StorageFeature 使用
5
manual?: boolean; // 是否手动控制数据
6
enable?: {
7
// 是否启用某些功能
8
pagination?: boolean; // 是否启用分页
9
toolbar?: boolean; // 是否启用工具栏
10
visible?: boolean; // 是否启用隐藏列
11
filters?: boolean; // 是否启用过滤
12
};
13
enableDefault?: {
14
// 是否启用默认功能
15
toolbar?: boolean; // toolbar 默认功能,包含选中显示多选操作状态切换等
16
th?: boolean; // th 多于一行时,启用 border
17
};
18
getProps?: {
19
// 自定义 BaseTable 中各个组件的 props,可以通过函数返回。各个组件的 props 参考 BaseTable
20
filters?: (table: Table<TData>) => BaseTable.ToolbarProps['filterProps'];
21
toolbar?: (
22
table: Table<TData>
23
) => Partial<Omit<BaseTable.ToolbarProps, 'filtersProps' | 'enableFilters'>>;
24
table?: (table: Table<TData>) => Partial<BaseTable.TableProps>;
25
th?: (
26
table: Table<TData>,
27
header: Header<TData, unknown>
28
) => Omit<BaseTable.TableCellProps, 'ref'>;
29
pagination?: (table: Table<TData>) => Partial<BaseTable.BaseTablePaginationProps> & {
30
total?: number;
31
};
32
tr?: (table: Table<TData>, row: Row<TData>) => Partial<BaseTable.TableRowProps>;
33
td?: (table: Table<TData>, props: Record<string, any>) => Omit<BaseTable.TableCellProps, 'ref'>;
34
empty?: () => Partial<BaseTable.TableFilteredEmptyProps>;
35
};
36
37
registerHandlers?: StateHandler[];
38
}

options.meta.registerHandlers

扩展 table 的状态处理函数,通过 registerHandlers 注册。

stateKeys 为 '*' 时,是通过 useEffect 监听所有状态变化。(keyof TableState[]) 时,通过 onXXXChange 监听状态变化。

handleNamecallback 为可选项,callback 优先级大于 handleName

1
interface StateHandler {
2
handlerName?: string; // options 中的方法名
3
stateKeys: (keyof TableState)[] | '*'; // 监听的状态
4
callback?: (state: Partial<TableState>) => void; // 状态变化时的回调
5
}

options.columns

通过设置 column.meta 自定义列配置

1
interface ColumnMeta<TData extends RowData, TValue = unknown> {
2
description?: Record<string, any>; // icon ? tooltip props
3
// filterOptions?: { key: string; label: React.ReactNode }[]; // 过滤选项
4
selectType?: 'single' | 'multiple'; // 多选类型
5
sortable?: boolean; // 是否可排序
6
searchKey?: string; // 自定义搜索 key
7
th?: Partial<BaseTable.TableCellProps>; // baseTable th props,优先级高于 getProps.th
8
td?: Partial<BaseTable.TableCellProps>; //baseTable td props,优先级高于 getProps.td
9
}

Feature

Status2StorageFeature

加入到 _features 后,默认将配置的 state 中字段存储到 localStorage 中。 getDefaultTableOptions 会自动注册该 feature。

  • options.state2Storage 状态转换为存储的方法,将 state 转换为存储的方法。
  • options.storage2State 存储转换为状态的方法,将存储转换为状态的方法。
  • options.meta.storageKeys 需要存储的字段。
1
// storageKey 字段构成 kube-table-${tableName}-state
2
interface StorageStateOptions {
3
storage2State?: (storageKey: string) => Partial<TableState>;
4
state2Storage?: (storageKey: string, state: Partial<TableState>) => void;
5
}
6
7
interface TableMeta<TData extends RowData> {
8
storageKeys?: Array<keyof TableState>;
9
tableName: string;
10
}

getDefaultTableOptions(config)

可快速生成默认 options 配置项

config:

1
interface Config {
2
tableName: string;
3
manual: boolean; // 是否手动控制数据
4
enableToolbar?: boolean; // 是否启用 toolbar
5
enablePagination?: boolean; // 是否启用分页
6
enableVisible?: boolean; // 是否启用隐藏列
7
enableFilters?: boolean; // 是否启用过滤
8
enableStateToStorage?: boolean; // 是否将 state 存储到 storage,配合 options.meta.storageKeys 使用
9
enableSelection?: boolean; // 是否启用选择
10
enableSort?: boolean; // 是否启用排序
11
enableMultiSelection?: boolean; // 是否启用多选
12
enableInitParamsByUrl?: boolean; // TODO: 是否启用 url 参数初始化(未实现)
13
enableParamsToUrl?: boolean; // TODO: 是否启用 url 参数(未实现)
14
}

默认开启功能

  • enableFilters
  • enablePagination
  • enableToolbar
  • enableVisible
  • enableStateToStorage
  • enableSort

默认启用 Feature

  • Status2StorageFeature

默认生成配置

1
{
2
storageStateKeys: ['columnVisibility'],
3
registerHandlers: manual
4
? [
5
{
6
handlerName: 'onParamsChange',
7
stateKeys: ['pagination', 'columnFilters', 'sorting'],
8
},
9
]
10
: [],
11
}

BaseTable

BaseTable.TableProps

1
interface TableInnerProps {
2
padding?: 'normal' | 'none';
3
size?: 'small' | 'medium';
4
stickyHeader?: boolean; // 是否固定表头
5
className?: string;
6
style?: React.CSSProperties;
7
tableWrapperClassName?: string;
8
}

BaseTable.TableHeadProps

1
interface TableHeadProps {
2
className?: string;
3
style?: React.CSSProperties;
4
hasBorder?: boolean; // table th 是否有边框
5
}

BaseTable.TableBodyProps

1
interface TableBodyProps {
2
className?: string;
3
style?: React.CSSProperties;
4
hasBorder?: boolean; // table body 中 td 是否有边框
5
}

BaseTable.TableRowProps

1
export interface TableRowProps {
2
className?: string;
3
hover?: boolean; // 是否 hover 效果
4
selected?: boolean; // 是否选中
5
style?: React.CSSProperties;
6
}

BaseTable.TableCellProps

1
/**
2
padding 为 normal 时, variant 和 size 对应 padding 属性
3
'head-small': '8px 12px',
4
'head-medium': '16px 12px',
5
'body-small': '4px 8px',
6
'body-medium': '8px 12px',
7
*/
8
export type TableCellProps = {
9
padding?: 'none' | 'normal'; // 单元格 padding
10
align?: 'left' | 'center' | 'right' | 'justify'; // 单元格对齐方式
11
className?: string;
12
size?: 'small' | 'medium'; // 单元格大小
13
ariaSort?: 'asc' | 'desc' | false; // 是否排序
14
variant?: 'head' | 'body'; // 区分 th 和 td
15
stickyHeader?: boolean; // 是否固定表头
16
fixed?: 'left' | 'right'; // 固定列
17
fixedWidth?: number; // 固定列时的宽度(当 position 为 sticky; left 或者 right 值)
18
fixedLastLeft?: boolean; // 是否是最左侧的 fixed,主要用于隔断阴影效果
19
fixedLastRight?: boolean; // 是否是最右侧的 fixed,主要用于隔断阴影效果
20
style?: React.CSSProperties;
21
hasBorder?: boolean;
22
};

BaseTable.ToolbarProps

1
interface ToolbarProps {
2
enableBatchActions: boolean; // 是否多选时操作
3
enableSettingMenu?: boolean; // 是否暂时操作按钮
4
onDisableBatchActions?: () => void; // 取消多选操作框
5
enableFilters?: boolean; // 是否启用过滤
6
settingMenu?: React.ReactNode; // 操作列表
7
settingMenuText?: string;
8
toolbarLeft?: React.ReactNode; // left 组件
9
toolbarRight?: React.ReactNode; // right 组件
10
batchActions?: React.ReactNode; // 多选操作按钮
11
filterProps: {
12
// FilterInput props
13
filters?: any;
14
placeholder?: string;
15
suggestions: Suggestions;
16
simpleMode?: boolean;
17
onChange?: (value: any) => void;
18
initialKeyword?: string;
19
};
20
onFilterInputChange?: (value: any) => void; // FilterInput onChange
21
refetch?: any; // 刷新
22
loading?: boolean; // 刷新按钮上的 loading
23
}

BaseTable.EmptyProps

1
// empty 创建按钮 props
2
interface CreateButtonProps {
3
enableCreate?: boolean;
4
createButton?: ReactElement;
5
clickCreateButtonFn?: (event: MouseEvent<HTMLButtonElement>) => void;
6
}
7
8
// data 为空,无过滤条件
9
export type TableEmptyProps = PropsWithChildren<EmptyProps & CreateButtonProps>;
10
11
interface DescriptionProps {
12
clearAndRefetch?: false | (() => void); // 清除过滤条件
13
refetch?: false | (() => void); // 刷新
14
}
15
16
// data 为空,有过滤条件
17
export type TableFilteredEmptyProps = TableEmptyProps & DescriptionProps;

完整示例

Base Table

BaseTable 是一个基础的表格组件,提供了一些基础的表格组件,如 Table, TableHead, TableBody, TableRow, TableCell。

baseTable selected

BaseTable 顶部固定

BaseTable 列固定

BaseTable Pagination

BaseTable with toolbar