Skip to content

Table 表格

表格组件,用于展示结构化数据。支持排序、自定义列、空状态、固定表头等常用功能。

基础用法

最简单的表格,只需传入列配置和数据。

斑马纹与悬停

通过 stripedhoverable 属性增强表格可读性。

排序

在列配置中设置 sortable: true,即可点击表头进行排序。支持受控和非受控两种模式。

非受控模式(默认)

受控模式

通过 sort-keysort-order 控制排序状态,并监听 @sort 事件。

固定表头

当表格数据较多时,可以固定表头,滚动时表头始终可见。

自定义字段名

如果数据字段不是预期的名称,可通过 labelKeyvalueKey 指定(与 Select 组件一致)。

自定义列内容

Table 组件提供两种自定义列内容的方式,你可以根据场景选择。

方式一:通用 cell 插槽(推荐)

使用 #cell 插槽统一处理所有列,通过 column.key 判断是哪一列。这种方式有完整的 IDE 自动补全提示。

方式二:精确列插槽 #column-{key}

为每一列单独定义插槽,插槽名称为 column- 加上列的 key 值。

两种方式对比

方式自动补全类型检查适用场景
#cell✅ 有提示✅ 有报错列较多,或需要 IDE 辅助
#column-{key}❌ 无提示✅ 有报错列较少,追求简洁

两种方式可以同时使用,精确列插槽优先级更高:

列宽与对齐

通过 widthalign 属性控制列样式。

空状态

数据为空时显示提示文案。可通过 empty-text 自定义文案,或通过 #empty 插槽完全自定义。

响应式

responsive 属性(默认开启)使表格在小屏幕下自动横向滚动,避免布局错乱。

行点击事件

通过 @row-click 监听行点击事件。

加载状态

Table 组件不内置加载状态,推荐配合 Skeleton 骨架屏组件使用:

API

Props

属性类型默认值说明
columnsTableColumn[][]列配置
dataany[][]表格数据
emptyTextstring'暂无数据'空状态文案(插槽优先)
showHeaderbooleantrue是否显示表头
stripedbooleanfalse是否显示斑马纹
hoverablebooleantrue是否显示悬停高亮
scrollablebooleanfalse是否强制横向滚动
responsivebooleantrue是否响应式(小屏自动滚动)
fixedHeaderbooleanfalse是否固定表头
maxHeightstring'400px'固定表头时的最大高度(配合 fixedHeader 使用)
sortKeystringundefined当前排序字段(受控模式)
sortOrder'asc' | 'desc'undefined当前排序方向(受控模式)
labelKeystring'label'全局默认标题字段名
valueKeystring'value'全局默认数据字段名

TableColumn 配置

属性类型说明
keystring数据字段名(与 valueKey 二选一,优先级更高)
titlestring列标题(与 labelKey 二选一,优先级更高)
widthstring列宽度(如 '100px''10%'
align'left' | 'center' | 'right'文本对齐方式
sortableboolean是否可排序
labelKeystring自定义标题字段名(当 title 未提供时使用)
valueKeystring自定义数据字段名(当 key 未提供时使用)

Slots

名称参数说明
cell{ row, column, value }通用单元格插槽,通过 column.key 判断列
column-{key}{ row, value }精确列插槽,key 为列的 keyvalueKey
empty自定义空状态内容

Events

事件参数说明
update:sortKey(key: string)排序字段变化(v-model:sort-key)
update:sortOrder(order: 'asc' | 'desc')排序方向变化(v-model:sort-order)
sort({ key, order })排序变化(合并事件)
row-click(row, index, event)点击行

类型支持

Table 组件使用 Vue 3.3+ 的泛型组件特性,自动从 data 推断行数据类型

vue
<script setup lang="ts">
// ✅ 不需要手动定义接口,自动推断
const users = ref([
  { id: 1, name: "张三", email: "zhang@example.com" },
  { id: 2, name: "李四", email: "li@example.com" },
])

// ✅ columns 配置时,key 自动提示只能是 id | name | email
const columns = [
  { key: "name", title: "姓名" },
  { key: "email", title: "邮箱" },
]

// ✅ 事件回调中 row 自动推断类型
const handleRowClick = (row, index) => {
  console.log(row.name)
}
</script>

<template>
  <Table :columns="columns" :data="users" @row-click="handleRowClick">
    <template #cell="{ row }">
      {{ row.name }}
    </template>
  </Table>
</template>

如需显式使用类型,可从包中导入:

typescript
import type { TableColumn, CellSlotProps } from "moongate-vue"

注意事项

  • 排序支持数字和字符串类型,数字按数值比较,字符串按字典序比较
  • columns 中的 keyvalueKey 决定了插槽名称:#column-{key}#cell 中的 column.key
  • 空状态时,empty 插槽优先级高于 emptyText prop
  • responsive 默认开启,无需手动添加 overflow-x: auto
  • scrollableresponsive 可同时使用,效果为强制滚动
  • fixedHeader 需要配合 maxHeight 使用,否则表格会无限撑开
  • 固定表头时,表头会浮动在滚动内容上方,确保表格背景色已设置
  • 移动端建议谨慎使用固定表头功能
  • 建议在 tsconfig.json 中开启 strict: true 以获得最佳类型推断体验
  • 加载状态推荐配合 Skeleton 组件使用,Table 本身不内置加载逻辑

Released under the MIT License