Table 表格
表格组件:列由 eb-table-column 声明并注册到父表格(列组件自身不渲染 DOM),内置客户端排序、列筛选、多选 / 单选、展开行、固定列(sticky)、横向滚动、当前行高亮与空态,并支持表尾合计、加载遮罩与服务端排序,选中可经 v-model 受控,暴露排序、筛选、选中、展开等实例方法。
基础用法
data 传入行数组,eb-table-column 用 prop 绑定字段、label 定义表头;border 与 stripe 开启边框和斑马纹,sortable 让金额列出现排序箭头(点击循环升序、降序、取消)。斑马纹加在偶数行(自第 2 行起);组件始终开启行 hover 高亮,普通行 hover 时整行变浅灰,斑马行因底色规则声明在后、hover 仍保持斑马底色,两层不互相覆盖。数据密集的列表页推荐 stripe + border 组合,行间辨识度最高。
树形表格
数据行带 children 数组即自动启用树形渲染:首列显示展开箭头与层级缩进,点击箭头或调用行展开;default-expand-all 默认展开全部,tree-props 可自定义 children 字段名。
插槽列自定义单元格
在列内写 #default 作用域插槽即可完全接管单元格(scope 含 row、$index、column);show-overflow-tooltip 让超宽文本省略并以 title 提示全文。
排序与格式化
default-sort 指定初始排序(立即生效,非仅高亮箭头);sort-method 提供自定义比较函数(返回值自动乘以排序方向),sort-change 返回 { prop, order, column } 用于对接后端;formatter 把原始值格式化为展示文本。
当前排序:amount descending
服务端排序
列设 sortable="custom" 后点击箭头不在本地重排,只触发 sort-change 携带目标排序,由页面请求或重排数据后再传入;箭头状态仍在本地维护,适合分页与大数据量场景。本例在事件回调里模拟服务端返回。
服务端返回顺序:华北仓、华南仓、华东仓
横向滚动
scroll-x 声明表格总宽(数字按 px,也可传 max-content 由内容撑开):列宽合计超出容器时表体出现横向滚动条,表头随之同步偏移,fixed 列保持吸附;列声明了 min-width 时按该宽度保底、不被压缩。未传时列宽自适应容器,行为不变。
多选
type="selection" 声明多选列,表头出现全选框(含半选态);selectable 可禁用指定行(本例仅已支付行可选)。选中项通过 selection-change 同步,也可用 v-model:selection 受控(传行数组回填,翻页后按 rowKey 回显),或用实例方法 clearSelection 清空。
已选 0 项:—
单选
selection-type="radio" 把选择列换成单选框:选中即唯一值,重复点击不变更,表头不再渲染全选框。此时受控值 v-model:selection 为单个 key(需配合 row-key,未选中为 null;传行对象或单元素数组也可回显),selection-change 仍发单元素数组。
当前选中 key:—
展开行
type="expand" 声明展开列,默认插槽渲染在展开的附加行中(scope 为 { row, $index });配合 default-expand-all 或 expand-row-keys(需 rowKey)可默认展开。展开态变化统一经 expand-change 上报 (expandedKeys, row, expanded):expandedKeys 为当前全部展开 key(设 rowKey 时为业务 key),平铺展开列与树形行共用同一签名。
空态
数据为空时渲染空态区域,默认文案为内置国际化「暂无数据」,可用 empty-text 修改,或用 #empty 插槽整体替换(可搭配 eb-empty)。
加载中
loading 为真时表体覆盖半透明遮罩并显示旋转指示,阻断数据区交互;适合远程拉取数据期间开启、结束后关闭。遮罩只盖住表体(含表尾合计),表头保持可见。
虚拟滚动
virtual 开启后万级行只渲染可视窗口,表头 / 列宽 / 固定列 / 多选 / 键盘导航全量保留。需配合 height 或 maxHeight 形成滚动视口;row-height 需与实际行高一致(受 size 与内容换行影响时显式对齐)。展开行与树形层级不参与虚拟模式。
行内编辑
列设置 editable 后,单元格点击进入编辑:Enter 或失焦提交、Esc 取消;提交时更新行数据并触发 cell-change(携带 row / prop / value / oldValue / $index),在其中做校验或落库。需要复杂编辑器(选择器、日期等)时用 default 插槽自行承载,插槽列不受 editable 影响。
API
Table Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| data | 表格数据 | array | [] |
| height | 固定高度,表体区域内滚动 | string | number | — |
| maxHeight | 最大高度,超出后表体滚动 | string | number | — |
| scrollX | 横向滚动总宽,数字按 px,也可传 max-content 由内容撑开;列宽合计超出容器时表体横向滚动、表头同步偏移,fixed 列照常吸附,minWidth 列按声明保底 | number | string | — |
| border | 边框模式 | boolean | false |
| stripe | 斑马纹 | boolean | false |
| loading | 表体加载遮罩,远程取数期间开启并阻断数据区交互 | boolean | false |
| size | 尺寸,缺省继承表单上下文 | large | default | small | |
| fit | 列宽自适应容器(minWidth 列参与拉伸) | boolean | true |
| showHeader | 是否渲染表头(当前版本始终渲染表头) | boolean | true |
| highlightCurrentRow | 点击行时高亮并触发 current-change | boolean | false |
| rowKey | 行键,字段名或 (row) => key | string | function | — |
| rowClassName | 行附加类名,函数按行数据返回,也可直接传字符串 | (row, index) => string | string | |
| defaultExpandAll / expandRowKeys | 默认展开全部 expand 行 / 指定默认展开行的 key 数组(需设置 rowKey);expandRowKeys 仅初始化生效,动态展开用实例方法 toggleRowExpansion | boolean / array | false / [] |
| defaultSort | 初始排序 { prop, order },order 为 ascending / descending | object | { prop: '', order: '' } |
| selectOnIndeterminate | 预留参数(当前未参与全选逻辑) | boolean | true |
| selection (v-model:selection) | 选中受控:checkbox 模式为行数组(回填元素可为 key,需 rowKey),radio 模式为单个 key(未选中为 null,兼容行对象或单元素数组回显);内部变更同步 emit update:selection,不传则组件内部自持 | array / key | — |
| selectionType | 选择模式:checkbox 多选(表头全选)/ radio 单选(选中即唯一值,表头无全选框) | checkbox | radio | checkbox |
| emptyText | 空数据文案,优先级低于 empty 插槽 | string | |
| showSummary / summaryMethod | 表尾合计行;summaryMethod 缺省对全数字列求和、其余列为空,传入时接收当前(排序/筛选后)数据数组并返回以列 prop 为键的文本映射 | boolean / function | false |
| virtual | 虚拟滚动,万级行只渲染可视窗口(需配合 height / maxHeight;展开行与树形层级不参与) | boolean | false |
| rowHeight | 虚拟模式行高,需与实际行高一致 | number | 48 |
Table Events
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| select | 手动勾选某一行 | (selection, row) => void | — |
| select-all | 点击表头全选框 | (selection) => void | — |
| selection-change | 选中项变化(radio 单选模式同样发单元素数组或空数组;受控时同时 emit update:selection,checkbox 发数组、radio 发单 key 或 null) | (selection) => void | — |
| cell-click | 单元格点击 | (row, prop, value, event) => void | — |
| row-click | 行点击(开启 highlightCurrentRow 时同时更新当前行) | (row, index, event) => void | — |
| row-dblclick / row-contextmenu | 行双击 / 行右键 | (row, index, event) => void | — |
| sort-change | 排序变化(含 custom 服务端排序),order 为 ascending / descending / null | ({ prop, order, column }) => void | — |
| filter-change | 筛选应用或重置,参数为以列 id 为键的选中值映射 | (activeFilters) => void | — |
| expand-change | 展开态变化(平铺展开列与树形行统一载荷;expandedKeys 为当前全部展开 key,设 rowKey 时为业务 key,树形未命中保留路径 key,未设 rowKey 时为行引用) | (expandedKeys, row, expanded) => void | — |
| current-change | 当前行变化 | (currentRow, prevRow) => void | — |
| header-click | 表头单元格点击 | (column, event) => void | — |
| cell-change | 行内编辑提交(值有变化时触发,行数据已同步更新) | ({ row, prop, value, oldValue, $index }) => void | — |
Table Slots
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| default | eb-table-column 列定义 | — | — |
| empty | 空数据区域(替换 emptyText) | — | — |
Table Methods(defineExpose)
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| sort / clearSort | 程序化排序 / 清空排序状态 | (prop, order) => void / () => void | — |
| toggleRowSelection | 勾选 / 取消某行,selected 缺省时取反 | (row, selected?) => void | — |
| toggleAllSelection | 切换全选 | () => void | — |
| clearSelection / clearFilter | 清空所有选中 / 清空筛选(缺省清全部,可传列 key 数组) | () => void / (columnKeys?) => void | — |
| toggleRowExpansion | 展开 / 收起行,expanded 缺省时取反 | (row, expanded?) => void | — |
| setCurrentRow | 设置当前行(配合 highlightCurrentRow) | (row) => void | — |
| doLayout | 重新布局(sticky 布局自适应,保留兼容) | () => Promise | — |
| getSelection | 获取当前选中行数组 | () => array | — |
| ref | 根 DOM 元素 | HTMLElement | — |
TableColumn Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| type | 特殊列类型:selection 多选 / expand 展开 / index 序号 | selection | expand | index | — |
| prop | 字段名(同时作为列 id 与筛选、排序默认依据) | string | |
| label | 列标题 | string | |
| width / minWidth | 固定列宽 / 最小列宽(fit 模式下 minWidth 参与拉伸) | string | number | — |
| fixed | 固定列(position: sticky 实现) | boolean | left | right | false |
| sortable | 开启排序;设为 custom 时不做本地排序,仅触发 sort-change 由服务端排序 | boolean | string | false |
| sortMethod | 自定义比较函数,返回值自动乘以排序方向 | (a, b) => number | null |
| sortBy | 排序取值来源,字段名、字段数组或取值函数 | string | array | (row) => any | — |
| sortOrders | 点击循环的排序序列 | array | ['ascending', 'descending', null] |
| filters | 列筛选项 [{ text, value }],配置后表头出现筛选图标 | array | [] |
| filterMethod | 筛选方法(必须提供才会参与过滤) | (value, row, column) => boolean | null |
| filterMultiple | 筛选项是否可多选 | boolean | true |
| columnKey | 列唯一键,同 prop 多列或 clearFilter 定位时使用 | string | — |
| align | 内容对齐 | left | center | right | left |
| headerAlign | 表头对齐,缺省跟随 align | left | center | right | — |
| showOverflowTooltip | 单元格超宽省略并以 title 提示全文 | boolean | object | false |
| formatter | 展示文本格式化 | (row, column, value, index) => string | null |
| className / labelClassName | 单元格 / 表头单元格类名 | string | |
| selectable | selection 列的行可选判断,返回 false 禁用该行 | (row, index) => boolean | null |
| index | index 列序号,数字为起始号,函数自定义 | number | (index) => number | — |
| editable | 行内编辑:点击单元格进入编辑,Enter / 失焦提交、Esc 取消(default 插槽列不受影响) | boolean | false |
TableColumn Slots
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| default | 自定义单元格;type=expand 时为展开行内容 | scope: { row, $index, column } | — |
| header | 自定义表头 | scope: { column, $index } | — |