Skip to content

Table 表格 ​

用于展示多条结构类似的数据。

基础用法 ​

姓名
年龄
城市
张三28北京
李四32上海
王五25广州
vue
<my-table :data="data" :columns="columns" border stripe hover />

次要变体 ​

variant="minor" 提供更轻量的视觉风格,适合在卡片或侧栏中使用。

姓名
年龄
城市
张三28北京
李四32上海
王五25广州
vue
<my-table :data="data" :columns="columns" variant="minor" hover />

排序 ​

设置列的 sortable: true 启用排序,点击表头切换升序/降序/无排序。设为 'custom' 则只触发事件不自行排序。

姓名
年龄
城市
张三28北京
李四32上海
王五25广州
vue
<my-table :data="data" :columns="columns" border @sort-change="onSortChange" />

行选择 ​

selection 启用复选框,通过 v-model:selection-model 双向绑定选中行。

员工ID
成员
角色
部门
状态
1
张三
zhangsan@example.com
前端开发技术部在职
2
李四
lisi@example.com
后端开发技术部在职
3
王五
wangwu@example.com
UI设计师设计部试用
4
赵六
zhaoliu@example.com
产品经理产品部离职
5
孙七
sunqi@example.com
测试工程师质量部在职
6
周八
zhouba@example.com
前端开发技术部试用
7
吴九
wujiu@example.com
后端开发技术部在职
8
郑十
zhengshi@example.com
运维工程师运维部离职
vue
<my-table
  :data="employees"
  :columns="columns"
  selection
  v-model:selection-model="selectedRows"
  :row-key="'id'"
  border
  hover
/>

自定义单元格 ​

通过列的 render 函数或具名插槽自定义单元格内容。支持头像、状态标签等。

员工ID
成员
角色
部门
状态
1
张三
zhangsan@example.com
前端开发技术部在职
2
李四
lisi@example.com
后端开发技术部在职
3
王五
wangwu@example.com
UI设计师设计部试用
4
赵六
zhaoliu@example.com
产品经理产品部离职
5
孙七
sunqi@example.com
测试工程师质量部在职
6
周八
zhouba@example.com
前端开发技术部试用
7
吴九
wujiu@example.com
后端开发技术部在职
8
郑十
zhengshi@example.com
运维工程师运维部离职
ts
const columns = [
  { key: 'id', title: '员工ID', width: 90 },
  {
    key: 'member', title: '成员', width: 220,
    render: (row) => h('div', { style: 'display:flex;align-items:center;gap:10px' }, [
      h('img', { src: row.avatar, style: 'width:32px;height:32px;border-radius:50%' }),
      h('div', [
        h('div', { style: 'font-weight:500' }, row.name),
        h('div', { style: 'font-size:12px;color:#999' }, row.email),
      ]),
    ]),
  },
  { key: 'role', title: '角色' },
  {
    key: 'status', title: '状态', align: 'center',
    render: (row) => {
      const s = statusMap[row.status]
      return h('span', {
        style: `padding:2px 10px;border-radius:12px;font-size:12px;font-weight:500;background:${s.bg};color:${s.color}`,
      }, s.text)
    },
  },
]

可展开行 ​

expandable 启用行展开,通过 expand 插槽自定义展开内容。accordion 限制同时只展开一行。

ID
姓名
角色
1张三前端开发
2李四后端开发
3王五UI设计师
4赵六产品经理
vue
<my-table :data="employees" :columns="columns" :row-key="'id'" expandable>
  <template #expand="{ row }">
    <div>邮箱:{{ row.email }} | 部门:{{ row.department }}</div>
  </template>
</my-table>

分页 ​

传入 pagination 配置开启内置分页,自动对数据进行切片。

ID
姓名
角色
1员工1前端
2员工2后端
3员工3设计
4员工4前端
5员工5后端
6员工6设计
7员工7前端
8员工8后端
9员工9设计
10员工10前端
共 30 条
vue
<my-table
  :data="data"
  :columns="columns"
  :pagination="{ total: 30, currentPage: 1, pageSize: 10 }"
  @page-change="handlePageChange"
/>

加载中 ​

loading 展示加载遮罩层。

姓名
年龄
城市
张三28北京
李四32上海
王五25广州
vue
<my-table :data="data" :columns="columns" :loading="loading" loading-text="加载中..." />

虚拟滚动 ​

virtualScroll + bodyHeight + rowHeight 开启虚拟滚动,只渲染可视区域的行。

ID
姓名
邮箱
角色
1用户1user1@example.com开发
2用户2user2@example.com设计
3用户3user3@example.com产品
4用户4user4@example.com开发
5用户5user5@example.com设计
6用户6user6@example.com产品
7用户7user7@example.com开发
8用户8user8@example.com设计
9用户9user9@example.com产品
10用户10user10@example.com开发
11用户11user11@example.com设计
12用户12user12@example.com产品
13用户13user13@example.com开发
14用户14user14@example.com设计
15用户15user15@example.com产品
16用户16user16@example.com开发
17用户17user17@example.com设计
vue
<my-table
  :data="largeData"
  :columns="columns"
  virtual-scroll
  :body-height="300"
  :row-height="44"
/>

列宽调整 ​

列的 resizable 不为 false 时(默认开启),拖拽列右侧边界可调整列宽。

姓名
年龄
城市
张三28北京
李四32上海
王五25广州

组件结构 ​

根元素 <div class="my-table"> 包含:loading 遮罩 __loading-overlay、滚动容器 __scroll(内为标准 <table> 结构:<thead class="my-table__head"> > <tr> > <th> 表头单元格;<tbody class="my-table__body"> > <tr> 数据行 > <td> 数据单元格,支持展开行 __expanded-row)、底部分页 __pagination-wrapper。

CSS 类名 ​

类名说明
.my-table根元素
.is-large大尺寸
.is-small小尺寸
.is-minor次要变体
.is-border带边框
.is-stripe斑马纹
.is-hover行悬停高亮
.is-loading加载中
.my-table__scroll滚动容器
.my-table__scroll--virtual虚拟滚动容器
.my-table__inner内部 <table> 元素
.my-table__head表头 <thead>
.my-table__header-cell表头单元格
.is-sortable可排序列
.is-left固定左侧
.is-right固定右侧
.my-table__header-cell--checkbox复选框列表头
.my-table__header-cell--expand展开列表头
.my-table__cell-inner表头单元格内部布局
.my-table__sort-icons排序图标组
.is-active排序激活
.is-asc升序
.is-desc降序
.my-table__sort-arrow--up升序箭头
.my-table__sort-arrow--down降序箭头
.my-table__body表体 <tbody>
.my-table__row数据行
.is-stripe-row斑马行
.my-table__cell数据单元格
.my-table__cell--checkbox复选框单元格
.my-table__cell--expand展开按钮单元格
.my-table__expand-icon展开图标
.is-expanded已展开
.my-table__expanded-row展开内容行
.my-table__expanded-cell展开内容单元格
.my-table__expanded-json展开的 JSON 展示
.my-table__resize-handle列宽调整手柄
.is-resizing调整中
.my-table__empty空数据提示
.my-table__loading-overlay加载遮罩层
.my-table__loading-text加载文字
.my-table__loading-spinner加载旋转图标
.my-table__pagination-wrapper分页容器

API ​

Props ​

属性说明类型默认值
data表格数据Record<string, any>[][]
columns列配置TableColumn[][]
variant视觉变体'default' | 'minor''default'
border是否带边框booleanfalse
stripe是否斑马纹booleanfalse
hover是否行悬停高亮booleanfalse
loading是否加载中booleanfalse
loadingText加载文字string'加载中...'
size表格尺寸'large' | 'default' | 'small''default'
emptyText空数据时文字string'暂无数据'
rowKey行唯一标识字段名或函数string | (row) => string''
defaultSort默认排序{ key: string, order: SortOrder }{}
selection是否开启行选择booleanfalse
selectionModel已选行(v-model)Record<string, any>[][]
selectable行是否可选(row, index) => boolean—
expandable是否开启行展开booleanfalse
expandedRows已展开行 key 列表(string | number)[][]
defaultExpandAll默认展开所有行booleanfalse
accordion手风琴模式(同时只展开一行)booleanfalse
pagination分页配置,false 禁用TablePaginationConfig | falsefalse
virtualScroll是否开启虚拟滚动booleanfalse
rowHeight行高(虚拟滚动需设置)number48
bodyHeight滚动容器高度number | string—

TableColumn ​

属性说明类型默认值
key列标识(对应 data 字段)string—
title列标题string—
width列宽string | number—
minWidth最小列宽(调整时约束)string | number—
align对齐方式'left' | 'center' | 'right''left'
sortable可排序('custom' 仅触发事件)boolean | 'custom'—
fixed固定列'left' | 'right'—
resizable可调整列宽booleantrue
render自定义渲染函数(row, col, idx) => VNode | string—

Events ​

事件说明回调参数
cell-click单元格点击(row, column)
row-click行点击(row, index)
sort-change排序改变(sort: SortState)
selection-change选择改变(rows)
update:selectionModel选择 v-model(rows)
expand-change展开改变(row, expanded)
update:expandedRows展开 v-model(keys)
page-change页码改变(page)
page-size-change每页条数改变(size)
column-resize列宽调整结束(column, newWidth)

Slots ​

名称说明作用域
[col.key]自定义列单元格{ row, value, index }
expand展开行内容{ row, expanded }
empty空数据内容—
default额外列(表头右侧)—