表格组件 - STable
不是 ATable 的封装,支持列拉伸/拖拽/属性配置,单元格合并/卡槽定义,Checkbox/Radio、内置分页等功能
演示
API
Props
STable Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| size | 表格大小 | STableSize | - |
| rowKey | 表格行 key 的字段 | STableRowKey | - |
| treeKey | 表格 树形结构 的字段 | STableTreeKey | 'children' |
| border | 设置边框。分组表头时 border="true" | boolean | false |
| sticky | 设置表格粘性头部和滚动条,详见下方 STable Sticky | STableStickyType | - |
| scroll | 表格是否可滚动,也可以指定滚动区域的宽高,详见 STable Scroll | STableScrollType | - |
| columns (v-model) | 表格列的配置描述, 详见 STable Column | STableColumnType[] | - |
| sources (v-model) | 表格数据源 | STableRecordType[] | - |
| summarys (v-model) | 表格总结栏数据源 (tfoot) | STableRecordType[] | - |
| paginate (v-model) | 表格分页配置,详见 STable Paginate | STablePartPaginate | - |
| loadData | 表格数据远程加载,响应数据预处理,详见 Responser | STableLoadSource | - |
| tableLayout | 表格 CSS table-layout 样式 | 'auto' | 'fixed' | - |
| persistSourceRanges | 保持数据渲染,即使不在可视区域内。 | Array<number[]> | boolean | false |
| customHeaderRowAttrs | 设置表格 thead 行属性 (HTMLAttributes) | STableCustom HeaderRowAttrs | - |
| customBodyerRowAttrs | 设置表格 tbody 行属性 (HTMLAttributes) | STableCustom BodyerRowAttrs | - |
| customFooterRowAttrs | 设置表格 tfoot 行属性 (HTMLAttributes) | STableCustom FooterRowAttrs | - |
| customBodyerRowStates | 设置表格 tbody 行 State (例如,禁用行展开、禁用选项) | STableCustom BodyerRowStates | - |
| customHeaderCellRender | 自定义 thead 单元格渲染 | STableHeader CellRender | - |
| customBodyerCellRender | 自定义 tbody 单元格渲染 | STableBodyer CellRender | - |
| customFooterCellRender | 自定义 tfoot 单元格渲染 | STableFooter CellRender | - |
| defaultColumnSorters | 设置默认的列排序 | STableSorterType[] | [] |
| defaultSelectAllRows | 默认选择所有表格行 key (Checkbox) | boolean | false |
| defaultExpandAllRows | 默认展开所有表格行 key (Expanded) | boolean | false |
| preserveSelectedRowKeys | 分页渲染数据,是否记录之前选择的 Checkbox/Radio,以便后续恢复 | boolean | false |
| preserveExpandedRowKeys | 分页渲染数据,是否记录之前展开的行,以便后续恢复 | boolean | false |
| columnPresetResizable | 是否允许表格列拉伸调整宽度 | boolean | false |
| columnPresetDraggable | 是否允许表格列拖拽,调整表格列顺序 | boolean | false |
| columnSorterMultiple | 是否允许表格多列排序 | boolean | false |
| columnPresetSettings | 是否启用表格列筛选配置 | boolean | false |
| rowSelectedStrictly | 表格树形数据,父子数据 CheckBox 状态是否不关联 (默认不关联) | boolean | true |
| rowExpandedByClick | 当表格存在展开行时,是否允许点击行展开其展开行 | boolean | false |
| cellMegreNormalize | 当表格存在合并单元格时,可以帮助我们自动适配相邻的单元格情况 | boolean | true |
| expandIndentSize | 因展开行图标,每一层的缩紧样式 | number | - |
| selectIndentSize | 因选择项图标,每一层的缩紧样式 | number | - |
| selectedRowMode | 是否启用选择框 (Checkbox / Radio) | 'Radio' | 'Checkbox' | 'None' | 'None ' |
| selectedRowKeys (v-model) | 记录表格已选择的行 key | STableKey[] | [] |
| expandedRowKeys (v-model) | 记录表格已展开的行 key | STableKey[] | [] |
| tHeaderThStyle | 设置表格 thead th 样式 | Record<string, any> | {} |
| tBodyerTdStyle | 设置表格 tbody td 样式 | Record<string, any> | {} |
| tFooterTdStyle | 设置表格 tfoot td 样式 | Record<string, any> | {} |
| expandTdStyle | 设置表格展开行 expand td 样式 | Record<string, any> | {} |
| paginateStyle | 设置表格分页容器样式 | Record<string, any> | {} |
| loadOnScroll | 仅在 paginate.mode="local" 启用,滚动加载分页数据 | boolean | false |
| bodyMinRows | 表格最小行数,值为 true 时,与分页 pageSize 保持一致 | boolean | number | false |
| showHeader | 显示表格 head 部分 (thead) | boolean | true |
| showBodyer | 显示表格 body 部分 (tbody) | boolean | true |
| showFooter | 显示表格 foot 部分 (tfoot) | boolean | true |
| immediate | 是否立刻调用 loadData, 加载远程数据 | boolean | true |
| loadinger | 是否在 UI 上隐藏 loading, 即使 loading 值为 true | boolean | true |
| loading (v-model) | 表格是否正在加载数据中 | boolean | false |
| virtual | 表格启用虚拟列表,提升性能 (目前尚未启用) | boolean | true |
STable Sticky
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| topHeader | 启用表格 thead 置顶吸附 | boolean | number | true |
| leftFooter | 当表格某些列左侧固定时,滚动时 tfoot 是否也随之固定 | boolean | number | true |
| rightFooter | 当表格某些列右侧固定时,滚动时 tfoot 是否也随之固定 | boolean | number | true |
| bottomFooter | 启用表格 tfoot 置底吸附 | boolean | number | true |
| bottomScrollbar | 当表格底部超出可视区域时,是否显示横向滚动条 | boolean | false |
STable Scroll
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| x | 设置横向滚动,指定滚动区域的宽 | number | string | false | false |
| y | 设置纵向滚动,指定滚动区域的高 | number | string | false | false |
| overflow | 设置滚动区域 overflow 属性 | 'hidden' | 'visible' | 'auto' | - |
| scrollToFirstOffsetX | 表格滚动 x轴 横向方向偏移量 | number | - |
| scrollToFirstOffsetY | 表格滚动 y轴 纵向方向偏移量 | number | - |
| scrollToFirstTargetX | 指定表格滚动 x轴 初始位置 | number | 0 |
| scrollToFirstTargetY | 指定表格滚动 y轴 初始位置 | number | 0 |
| scrollToFirstXOnChange | 分页/排序/筛选,是否滚动到初始位置 | boolean | true |
| scrollToFirstYOnChange | 分页/排序/筛选,是否滚动到初始位置 | boolean | true |
| getScrollResizeContainer | 指定滚动区域 (祖先节点), 一般无需指定,自动获取 | () => HTMLElement | - |
STable Column
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| key | 表格列 key,如果已经设置了唯一的 dataIndex,可以忽略这个属性 | string | - |
| title | 表格列 title 标题 | string | - |
| dataIndex | 列数据在数据项中对应的路径 | string | string[] | - |
| children | 表格嵌套的列选项 | STablePartColumnType[] | - |
| align | 设置表格列的对齐方式 | 'left' | 'center' | 'right' | - |
| fixed | 设置表格列是否固定及其方式 | 'left' | 'right' | false | - |
| width | 表格列宽度 | number | - |
| minWidth | 表格列最小宽度, 影响列 resizing (最小限制) | number | - |
| maxWidth | 表格列最大宽度, 影响列 resizing (最大限制) | number | - |
| settings | 表格列筛选配置项中该列的预设值 | { checkbox?: boolean; disabled?: boolean; } | - |
| resizable | 配置表格该列 resizable?,覆盖 props.columnPresetResizable | boolean | - |
| ellipsis | 表格单元格内容过长,自动省略 | boolean | false |
| tooltip | 表格单元格内容过长,自动省略,且 tooltip 提示 | boolean | false |
| colSpan | 表格单元格多列合并 | number | - |
| rowSpan | 表格单元格多行合并 | number | - |
| sorter | 表格该列是否启用排序 | boolean | false |
| sorterField | 表格该列排序时使用的字段,默认从 dataIndex 获取 | string | - |
| expandIcon | 如果有树形数据或展开行内容,是否在表格该列显示 Expand Icon | boolean | - |
| customHeaderCellRender | 自定义 thead 单元格渲染,覆盖 props.customHeaderCellRender | STableHeaderCellRender | - |
| customBodyerCellRender | 自定义 tbody 单元格渲染,覆盖 props.customBodyerCellRender | STableBodyerCellRender | - |
| customFooterCellRender | 自定义 tfoot 单元格渲染,覆盖 props.customFooterCellRender | STableFooterCellRender | - |
STable Paginate
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| hideOnSinglePage | 只有一页时是否隐藏分页器 | boolean | false |
| defaultPageSize | 默认的每页条数 | number | 20 |
| pageSizeOptions | 指定每页可以显示多少条 | string[] | - |
| showSizeChanger | 是否展示 pageSize 切换器 | boolean | - |
| showQuickJumper | 是否可以快速跳转至某页 | boolean | false |
| showLessItems | 是否显示较少页面内容 | boolean | false |
| loadTotalSize | 分段加载数据的总条目 (仅 mode="local") | number | - |
| loadTotalPage | 分段加载数据的总页数 (仅 mode="local") | number | - |
| loadPageSize | 分段加载数据的每页条目 (仅 mode="local") | number | - |
| loadPageNo | 分段加载的当前最新页 (仅 mode="local") | number | - |
| showTotal | 用于显示数据总量和当前数据顺序 | boolean | (total, range) => void | - |
| totalSize | 分页数据总条目 | number | - |
| totalPage | 分页数据总页数 | number | - |
| pageSize | 分页数据每页条目 | number | - |
| pageNo | 分页数据当前页 | number | - |
| disabled | 是否禁用表格分页 | boolean | false |
| visible | 是否显示表格分页 | boolean | false |
| simple | 是否显示为简单分页 | boolean | false |
| fixed | 表格分页在纵轴方向于底部吸附固定。 | boolean | - |
| mode | 分页模式,默认远程数据。(local 尚未启用) | 'local' | 'remote' | 'remote' |
Emits
| 事件 | 说明 | 类型 |
|---|---|---|
| pageSizeChange | pageSize 变化的回调 | (pageNo: number, pageSize: number) => true |
| pageChange | 页码或 pageSize 改变的回调 | (pageNo: number, pageSize: number) => true |
| expand | 表格行展开时触发 | (keys: Array<STableKey>, records: Array<STableRecordType | null>) => true |
| select | 表格行 Checkbox 或 Radio 选项变换时触发 | (keys: Array<STableKey>, records: Array<STableRecordType | null>) => true |
| sorter | 表格列排序变化时 | (values: Array<STableSorterType>) => true |
Slots
| 插槽名 | 插槽说明 | 插槽参数 |
|---|---|---|
| expander | 表格展开行内容 卡槽 | record, rowIndex, groupIndex, groupLevel, groupIndexs, globalIndex |
| headerCell | 表格 thead 单元格 卡槽 | title, column, rowIndex, colIndex, paginater |
| bodyerCell | 表格 tbody 单元格 卡槽 | value, record, rowIndex, groupIndex, groupLevel, groupIndexs, globalIndex, column, colIndex, paginater |
| footerCell | 表格 tfoot 单元格 卡槽 | value, record, rowIndex, column, colIndex, sources, paginater |
Expose
| 属性/方法名 | 说明描述 | 类型 |
|---|---|---|
| reload | 表格重新加载当前数据 | (delay?: Promise<void> | boolean | number, force?: boolean) => Promise<void> |
| refresh | 表格刷新加载第一页数据 | (delay?: Promise<void> | boolean | number, force?: boolean) => Promise<void> |
| select | 表格手动选择指定选项 (Checkbox / Radio) | (keys: STableKey[]) => void |
| expand | 表格手动展开某些行 (仅对有展开内容或树形数据有效) | (keys: STableKey[]) => void |
| update | 手动更新并重新渲染表格 | (clean?: boolean) => void |
Definer
| 定义 | 说明 |
|---|---|
| tableSorterDefiner | 定义 Props.defaultColumnSorters 时的 TypeScript 提示和校验 |
| tableScrollDefiner | 定义 Props.scroll 时的 TypeScript 提示和校验 |
| tableStickyDefiner | 定义 Props.sticky 时的 TypeScript 提示和校验 |
| tableSourcesDefiner | 定义 Props.sources 时的 TypeScript 提示和校验 |
| tableSummarysDefiner | 定义 Props.summarys 时的 TypeScript 提示和校验 |
| tableColumnsDefiner | 定义 Props.columns 时的 TypeScript 提示和校验 |
| tablePaginateDefiner | 定义 Props.paginate 时的 TypeScript 提示和校验 |
| tableLoadDataDefiner | 定义 Props.loadData 时的 TypeScript 提示和校验 |
| tableResponserDefiner | 定义 Props.loadData 数据源的预处理,详见 Responser |
| tableCustomHeaderRowAttrsDefiner | 定义 Props.customHeaderRowAttrs 时的 TypeScript 提示和校 |
| tableCustomBodyerRowAttrsDefiner | 定义 Props.customBodyerRowAttrs 时的 TypeScript 提示和校 |
| tableCustomFooterRowAttrsDefiner | 定义 Props.customFooterRowAttrs 时的 TypeScript 提示和校 |
| tableCustomBodyerRowStatesDefiner | 定义 Props.customBodyerRowStates 时的 TypeScript 提示和校 |
| tableCustomHeaderCellRenderDefiner | 定义 Props.customHeaderCellRender 时的 TypeScript 提示和校 |
| tableCustomBodyerCellRenderDefiner | 定义 Props.customBodyerCellRender 时的 TypeScript 提示和校验 |
| tableCustomFooterCellRenderDefiner | 定义 Props.customFooterCellRender 时的 TypeScript 提示和校验 |
| tableEmitSorterDefiner | 定义 Emits.sorter 时的 TypeScript 提示和校验 |
| tableEmitSelectDefiner | 定义 Emits.select 时的 TypeScript 提示和校验 |
| tableEmitExpandDefiner | 定义 Emits.expand 时的 TypeScript 提示和校验 |
| tableEmitPageChangeDefiner | 定义 Emits.pageChange 时的 TypeScript 提示和校验 |
| tableEmitPageSizeChangeDefiner | 定义 Emits.pageSizeChange 时的 TypeScript 提示和校验 |
Responser
typescript
/**
* STable 默认支持如下响应数据
*
* 1. response: {
* result: {
* data: [], //数据源
* pageNo: 1, // 当前页数
* totalSize: 0, // 数据总条目
* }
* }
*
*
* 2. response: {
* result: [] //数据源,没有分页
* }
*
*
* 3. response: [] //数据源,没有分页
*
*/typescript
/**
* 假设基于业务需求,STable 需要加载如下数据,则我们可以在 main.ts 全局自定义
*
* response: {
* success: 'ok', // 'ok' 业务成功状态
* result: {
* pageSource: [...], //数据源
* pageCurrentNum: 1, // 当前页数
* pageTotalSize: 10, // 数据总条目
* }
* }
*/
tableResponserDefiner.interceptor = (response: any) => {
if (response.success !== "ok") {
return Promise.reject(response);
}
return {
data: response.result.pageSource, // 数据源 -> 'data' 字段
pageNo: response.result.pageCurrentNum, // 当前页数 -> 'pageNo' 字段
totalSize: response.result.pageTotalSize, // 数据总条目 -> 'totalSize' 字段
};
};