Skip to content

DynamicTable 动态表格

用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作。

基础用法

通过 columns 配置列,data 绑定数据。

姓名年龄地址状态
张三28北京市朝阳区在职
李四32上海市浦东新区在职
王五25广州市天河区离职
赵六30深圳市南山区在职
vue
<template>
  <x-dynamic-table :data="tableData" :columns="columns" />
</template>

<script setup>
import { ref } from 'vue'

const tableData = ref([
  { id: 1, name: '张三', age: 28, address: '北京市朝阳区' },
  { id: 2, name: '李四', age: 32, address: '上海市浦东新区' }
])

const columns = ref([
  { prop: 'name', label: '姓名', width: 120 },
  { prop: 'age', label: '年龄', width: 100 },
  { prop: 'address', label: '地址' }
])
</script>

带边框表格

设置 border 属性显示边框。

姓名年龄地址状态
张三28北京市朝阳区在职
李四32上海市浦东新区在职
王五25广州市天河区离职
赵六30深圳市南山区在职
vue
<template>
  <x-dynamic-table :data="tableData" :columns="columns" border />
</template>

斑马纹表格

设置 stripe 属性显示斑马纹。

姓名年龄地址状态
张三28北京市朝阳区在职
李四32上海市浦东新区在职
王五25广州市天河区离职
赵六30深圳市南山区在职
vue
<template>
  <x-dynamic-table :data="tableData" :columns="columns" stripe />
</template>

显示序号

设置 show-index 显示行序号。

序号 姓名年龄地址状态
1张三28北京市朝阳区在职
2李四32上海市浦东新区在职
3王五25广州市天河区离职
4赵六30深圳市南山区在职
vue
<template>
  <x-dynamic-table :data="tableData" :columns="columns" show-index />
</template>

操作列

设置 show-operation 显示操作列,默认提供删除按钮。

姓名年龄地址状态操作
张三28北京市朝阳区在职
李四32上海市浦东新区在职
王五25广州市天河区离职
赵六30深圳市南山区在职
vue
<template>
  <x-dynamic-table
    :data="tableData"
    :columns="columns"
    show-operation
    @delete-row="handleDeleteRow"
  />
</template>

<script setup>
const handleDeleteRow = (row, index) => {
  console.log('删除行:', row, index)
}
</script>

新增和删除行

设置 show-add-button 显示新增按钮,配合 show-operation 实现完整的增删功能。

序号 姓名年龄地址状态操作
1张三28北京市朝阳区
2李四32上海市浦东新区
vue
<template>
  <x-dynamic-table
    v-model:data="tableData"
    :columns="columns"
    show-index
    show-operation
    show-add-button
    @add-row="handleAddRow"
    @delete-row="handleDeleteRow"
  />
</template>

<script setup>
import { ref } from 'vue'

const tableData = ref([
  { id: 1, name: '张三', age: 28, address: '北京市朝阳区' }
])

const columns = [
  { prop: 'name', label: '姓名', width: 120 },
  { prop: 'age', label: '年龄', width: 100 },
  { prop: 'address', label: '地址' }
]

const handleAddRow = (newRow) => {
  console.log('新增行:', newRow)
}

const handleDeleteRow = (row, index) => {
  console.log('删除行:', row, index)
}
</script>

自定义操作列

通过 operation 插槽自定义操作列内容。

姓名年龄地址状态操作
张三28北京市朝阳区在职
李四32上海市浦东新区在职
王五25广州市天河区离职
赵六30深圳市南山区在职
vue
<template>
  <x-dynamic-table :data="tableData" :columns="columns" show-operation>
    <template #operation="{ row, $index, deleteRow }">
      <button @click="handleEdit(row)">编辑</button>
      <button @click="deleteRow">删除</button>
    </template>
  </x-dynamic-table>
</template>

排序

设置列的 sortable 属性启用排序功能。

姓名年龄地址状态
张三28北京市朝阳区在职
李四32上海市浦东新区在职
王五25广州市天河区离职
赵六30深圳市南山区在职
vue
<template>
  <x-dynamic-table
    :data="tableData"
    :columns="columns"
    @sort-change="handleSortChange"
  />
</template>

<script setup>
const columns = [
  { prop: 'name', label: '姓名', width: 120 },
  { prop: 'age', label: '年龄', width: 100, sortable: true },
  { prop: 'address', label: '地址' }
]

const handleSortChange = (sort) => {
  console.log('排序:', sort)
}
</script>

选择功能

设置 row-key 启用行选择功能。

姓名年龄地址状态
张三28北京市朝阳区在职
李四32上海市浦东新区在职
王五25广州市天河区离职
赵六30深圳市南山区在职
vue
<template>
  <x-dynamic-table
    :data="tableData"
    :columns="columns"
    row-key="id"
  />
</template>

加载状态

设置 loading 显示加载状态。

姓名年龄地址状态
张三28北京市朝阳区在职
李四32上海市浦东新区在职
王五25广州市天河区离职
赵六30深圳市南山区在职
vue
<template>
  <x-dynamic-table :data="tableData" :columns="columns" :loading="loading" />
</template>

<script setup>
import { ref } from 'vue'
const loading = ref(true)
</script>

固定高度

设置 heightmax-height 固定表格高度。

姓名年龄地址状态
张三28北京市朝阳区在职
李四32上海市浦东新区在职
王五25广州市天河区离职
赵六30深圳市南山区在职
vue
<template>
  <x-dynamic-table :data="tableData" :columns="columns" :height="200" border />
</template>

API

Props

属性说明类型默认值
data表格数据(支持 v-model)any[][]
columns列配置TableColumn[][]
height表格高度string | number
maxHeight表格最大高度string | number
rowKey行数据的 Key,用于选择功能string | (row) => string
loading是否加载中booleanfalse
border是否显示边框booleanfalse
stripe是否显示斑马纹booleanfalse
showHeader是否显示表头booleantrue
showIndex是否显示序号booleanfalse
showOperation是否显示操作列booleanfalse
showAddButton是否显示新增按钮booleanfalse
operationWidth操作列宽度string | number120
operationLabel操作列标题string'操作'
emptyText空数据提示文本string'暂无数据'
defaultSort默认排序{ prop: string; order: 'ascending' | 'descending' }

TableColumn 配置

属性说明类型默认值
prop列字段名string
label列标题string
width列宽度string | number
minWidth最小列宽string | number
align对齐方式'left' | 'center' | 'right''left'
sortable是否可排序boolean | 'custom'false
formatter格式化函数(row, column, cellValue, index) => string

Events

事件名说明回调参数
update:data数据变化时触发(data: any[])
sort-change排序变化时触发(sort: { prop: string; order: string | null })
row-click行点击时触发(row, column, event)
row-dblclick行双击时触发(row, column, event)
selection-change选择变化时触发(selection: any[])
select-all全选时触发(selection: any[])
cell-click单元格点击时触发(row, column, cell, event)
add-row新增行时触发(newRow: any)
delete-row删除行时触发(row: any, index: number)

Methods

方法名说明参数
clearSelection清空选择
getSelection获取选中行
addRow新增一行(rowData?: any)
deleteRow删除指定行(index: number)
getData获取当前数据

Slots

插槽名说明参数
column-[prop]自定义列内容{ row, column, $index }
operation自定义操作列{ row, $index, deleteRow }
toolbar自定义工具栏
empty空状态内容

基于 MIT 许可发布