import React from "react"; import { StyledProps } from "../_type"; export interface TableProps extends StyledProps { /** * 表格的列配置,必须提供 */ columns: TableColumn[]; /** * 表格的数据,可以是任意类型 */ records?: Record[]; /** * 表格行 `key` 的取值,提供作为的 `key` 数据字段名,或者提供获取 `key` 的回调。注意: * * - 不同数据不要提供重复的 `key` 值,否则会发生渲染与数据不一致 * - 如果不提供 `recordKey`,默认将会用索引位置生成 `key`,在数据变化等场景下,仍可能会发生渲染不一致问题 * - `2.6.0` 版本支持支持路径嵌套,如 `"info.name"` * * **😎 建议总是提供你的 `recordKey`** * */ recordKey?: (Record extends { [key: string]: any; } ? keyof Record : string) | ((record: Record, recordIndex: number) => string); /** * 如何判定给定的记录是否禁用(禁用的记录将不可选) * */ rowDisabled?: (record: Record) => boolean; /** * * 可以为每一行指定 `className` */ rowClassName?: (record: Record) => string; /** * 表格顶部显示的内容,可以用于显示 `loading`、数据为空等 */ topTip?: React.ReactNode; /** * 表格底部显示的内容,可用于显示记录创建等 * */ bottomTip?: React.ReactNode; /** * 使用的表格插件列表 */ addons?: TableAddon[]; /** * 是否带边框 * * - `false` 无边框 * - `true` 外边框 * - `"all"` 全边框 * @default false */ bordered?: boolean | "all"; /** * 是否展示为紧凑样式 * @default false */ compact?: boolean; /** * 禁用 Hover 时高亮 * @default false */ disableHoverHighlight?: boolean; /** * 禁用默认的文本溢出样式 * * 也可以通过 `columns` 中 `render` 对各列进行更精细的控制 * * @default false */ disableTextOverflow?: boolean; /** * 隐藏表头 * @default false */ hideHeader?: boolean; /** * 表格内容展示为上对齐,默认居中对齐 * @default false */ verticalTop?: boolean; } export interface TableColumn { /** * 列标识 * * - `2.6.0` 版本支持支持路径嵌套,如 `"info.name"` */ key: string; /** * 表头 * @docType React.ReactNode | ((column: TableColumn) => React.ReactNode) */ header: React.ReactNode | ((column: TableColumn) => React.ReactNode); /** * 数据渲染方法 * 如果不提供渲染方法,会尝试查找数据中 `key` 属性所指向的字段 * * @param record 对应的数据记录 * @param rowKey 当前渲染行的 `key` 值 * @param recordIndex 数据记录在记录集中的索引 * @param column 正在渲染的列 * @param columnIndex 列索引 */ render?: (record: Record, rowKey: string, recordIndex: number, column: TableColumn, columnIndex: number) => React.ReactNode; /** * 列宽度,可以指定 CSS 属性或数字 (单位:px) */ width?: string | number; /** * 对齐规则,左中右 * @default "left" */ align?: "left" | "center" | "right"; /** * 是否固定列(IE 下不生效) */ fixed?: "left" | "right"; } export interface TableAddon { /** * 获取插件信息 * @since 2.7.0 */ getInfo?: TableMiddleware<{ name: string; }>; /** * 在表格渲染前,可以返回更改的 props */ onInjectProps?: TableMiddleware>; /** * 对于每一行 (``) 的渲染结果,返回变更的结果。 * 变更的结果可以在原结果前后插入新行 */ onInjectRow?: TableMiddleware>; /** * 对于每一列的渲染结果,返回变更的结果 */ onInjectColumn?: TableMiddleware>; /** * 变更 `` 的渲染结果 */ onInjectBody?: TableMiddleware>; /** * 变更 `` 的渲染结果 */ onInjectHead?: TableMiddleware<(props: TableProps) => JSX.Element>; /** * 变更 `` 的渲染结果 */ onInjectTable?: TableMiddleware<(props: TableProps) => JSX.Element>; } export interface TableMiddleware { (next: T): T; } export interface TableBodyRender { (records: Record[], columns: TableColumn[], topTip: React.ReactNode, bottomTip: React.ReactNode): JSX.Element; } export interface TableRowRender { (record: Record, rowKey: string, recordIndex: number, columns: TableColumn[]): TableRowRenderResult; } export interface TableRowRenderResult { prepends: JSX.Element[]; row: JSX.Element; appends: JSX.Element[]; } export interface TableColumnRender { (record: Record, rowKey: string, recordIndex: number, column: TableColumn, /** * @2.0.10 新增 */ columnIndex?: number): TableColumnRenderResult; } export interface TableColumnRenderResult { props: React.TdHTMLAttributes; children: React.ReactNode; } export interface RowRenderContext { /** * 原内容 */ children: React.ReactNode; /** * 当前行记录 */ record: Record; /** * 当前行 Key */ rowKey: string; /** * 当前行序号 */ recordIndex: number; /** * 当前行是否被禁用 */ disabled: boolean; /** * 当前行深度 */ depth?: number; }