更新记录
1.0.4(2026-08-28) 下载此版本
- 新增合计行(
showSummaryRow+ 列级summary,支持 sum/avg/min/max/count 及自定义函数) - 新增合计列(
type: 'summary'+summaryFields,位置由列顺序决定) - 新增函数式计算列(
compute: (row, index) => value) - 新增导出数据钩子(
getExportData(),返回结构化数据)
1.0.3(2026-08-28) 下载此版本
- 支持自定义单元格插槽(
type: 'slot') - 支持自定义表头插槽(
headerSlot: true)
1.0.2(2026-03-31) 下载此版本
增加操作列功能 支持Vue3
查看更多平台兼容性
uni-app(4.07)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.2 | - | - | - | - | - | - | - |
| 微信小程序 | 微信小程序插件版本 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(4.07)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
SimpleX-Table 表格组件
一个功能丰富的 UniApp 表格组件,支持固定列、排序、滚动加载等功能。
功能特性
- 支持固定列(sticky columns)
- 支持列排序
- 支持水平和垂直滚动
- 支持自定义列宽
- 支持空数据提示
- 支持滚动加载更多
- 支持边框样式配置
- 支持自定义行唯一标识
- 支持操作列及自定义按钮配置
- 支持自定义单元格插槽(
type: 'slot') - 支持自定义表头插槽(
headerSlot: true) - 支持合计行(按列聚合)
- 支持合计列(按行汇总,位置可自定义)
- 支持函数式计算列
参数说明
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
data |
Array | [] |
表格数据 |
columns |
Array | - | 表头配置(必填) |
rowKey |
String/Function | 'id' |
行数据的唯一标识字段 |
height |
Number/String | 'auto' |
表格高度 |
emptyText |
String | '暂无数据' |
空数据提示文字 |
loadingText |
String | '加载中...' |
加载中提示文字 |
defaultColumnWidth |
Number | 75 |
默认列宽 |
border |
Boolean | false |
是否需要边框 |
defaultSort |
Object | {key: '', order: ''} |
默认排序配置 |
showSummaryRow |
Boolean | false |
是否显示合计行 |
summaryText |
String | '合计' |
合计行首列文案 |
Columns 配置项
每个 columns 数组元素支持以下属性:
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
title |
String | - | 列标题(必填) |
key |
String | - | 数据字段名 |
width |
Number | defaultColumnWidth |
列宽度 |
fixed |
Boolean | false |
是否固定列 |
align |
String | 'left' |
对齐方式(left/center/right) |
sortable |
Boolean | false |
是否可排序 |
type |
String | - | 特殊列类型('index' 序号列,'action' 操作列,'slot' 自定义插槽列,'summary' 合计列) |
buttons |
Array/Function | - | 操作列按钮配置,仅当 type: 'action' 时有效 |
headerSlot |
Boolean | false |
是否使用自定义表头插槽 |
compute |
Function | - | 函数式计算列,(row, index) => value |
summary |
String/Function | - | 合计行聚合方式(sum/avg/min/max/count 或 (data) => value) |
summaryFields |
Array | - | 合计列(type: 'summary')参与求和的字段名数组 |
emptyValue |
String | '' |
空值时显示的内容 |
ellipsis |
Boolean | false |
文本是否溢出省略 |
事件说明
| 事件名 | 参数 | 说明 |
|---|---|---|
sort-change |
{column, key, order, sortBy, sortOrder} |
排序状态改变时触发 |
scroll |
{scrollLeft, scrollTop} |
滚动时触发 |
action-click |
{btn, row, index} |
操作列按钮点击时触发 |
使用示例
基础用法
<template>
<view>
<simplex-table :data="tableData" :columns="columns" :height="400" border />
</view>
</template>
<script>
export default {
data() {
return {
tableData: [
{ id: 1, name: "张三", age: 25, department: "技术部" },
{ id: 2, name: "李四", age: 30, department: "产品部" },
{ id: 3, name: "王五", age: 28, department: "设计部" },
],
columns: [
{ title: "姓名", key: "name", width: 150 },
{ title: "年龄", key: "age", width: 150 },
{ title: "部门", key: "department", width: 150 },
],
};
},
};
</script>
固定列和排序
<template>
<view>
<simplex-table :data="tableData" :columns="columns" :height="400" @sort-change="handleSortChange" />
</view>
</template>
<script>
export default {
data() {
return {
tableData: [
{ id: 1, name: "张三", age: 25, department: "技术部", salary: 12000 },
{ id: 2, name: "李四", age: 30, department: "产品部", salary: 15000 },
{ id: 3, name: "王五", age: 28, department: "设计部", salary: 10000 },
],
columns: [
{ title: "ID", key: "id", width: 80, fixed: true, sortable: true },
{ title: "姓名", key: "name", width: 100, fixed: true },
{ title: "年龄", key: "age", width: 80, sortable: true },
{ title: "部门", key: "department", width: 120 },
{ title: "薪资", key: "salary", width: 100, sortable: true },
],
};
},
methods: {
handleSortChange(sortInfo) {
console.log("排序信息:", sortInfo);
// 根据 sortInfo.sortBy 和 sortInfo.sortOrder 进行排序处理
},
},
};
</script>
操作列
<template>
<view>
<simplex-table :data="tableData" :columns="columns" @action-click="handleActionClick" />
</view>
</template>
<script>
export default {
data() {
return {
tableData: [
{ id: 1, name: "张三", status: 1 },
{ id: 2, name: "李四", status: 0 },
],
columns: [
{ title: "姓名", key: "name", width: 150 },
{ title: "状态", key: "status", width: 100 },
{
title: "操作",
type: "action",
width: 150,
buttons: [
{ text: "编辑", class: "btn-edit", style: "color: #007aff;" },
{ text: "删除", class: "btn-delete", style: "color: #dd524d;" },
],
// 也支持动态返回按钮:
// buttons: (row) => row.status === 1 ? [{ text: '禁用' }] : [{ text: '启用' }]
},
],
};
},
methods: {
handleActionClick({ btn, row, index }) {
console.log("点击了按钮:", btn.text, "当前行数据:", row);
},
},
};
</script>
自定义插槽
<template>
<view>
<simplex-table :data="tableData" :columns="columns">
<!-- 自定义单元格:列配置 type: 'slot' 时生效 -->
<template #cell="{ row, column, index }">
<view v-if="column.key === 'status'">
{{ row.status === 1 ? "启用" : "禁用" }}
</view>
<view v-else-if="column.key === 'amount'">¥{{ row.amount }}</view>
</template>
<!-- 自定义表头:列配置 headerSlot: true 时生效 -->
<template #header="{ column }">
<view v-if="column.key === 'status'">状态(自定义)</view>
</template>
</simplex-table>
</view>
</template>
<script>
export default {
data() {
return {
tableData: [
{ id: 1, name: "张三", status: 1, amount: 1200 },
{ id: 2, name: "李四", status: 0, amount: 800 },
],
columns: [
{ title: "姓名", key: "name", width: 150 },
{ title: "状态", key: "status", width: 100, type: "slot", headerSlot: true },
{ title: "金额", key: "amount", width: 100, type: "slot" },
],
};
},
};
</script>
只有标记了
type: 'slot'/headerSlot: true的列才会走对应插槽,其余列保持默认渲染。插槽作用域参数:单元格为{row, column, index},表头为{column, index}。
合计行与列计算
<template>
<view>
<simplex-table :data="tableData" :columns="columns" show-summary-row />
</view>
</template>
<script>
export default {
data() {
return {
tableData: [
{ id: 1, name: "张三", jan: 100, feb: 200, price: 15, qty: 2 },
{ id: 2, name: "李四", jan: 150, feb: 250, price: 20, qty: 3 },
],
columns: [
{ title: "姓名", key: "name", width: 120 },
// 函数式计算列
{ title: "金额", key: "amount", width: 120, compute: (row) => row.price * row.qty },
// 合计行:配置了 summary 的列参与聚合
{ title: "一月", key: "jan", width: 100, summary: "sum" },
{ title: "二月", key: "feb", width: 100, summary: "avg" },
// 合计列:位置由列顺序决定,可放在任意位置
{ title: "两月合计", type: "summary", summaryFields: ["jan", "feb"], width: 120 },
],
};
},
};
</script>
合计行通过
show-summary-row开启,只有配置了summary的列会参与聚合,首列默认显示“合计”。合计列的位置由它在columns数组中的顺序决定,可放在任意位置。
自定义计算
合计行的 summary 和计算列都可以传入函数,实现任意逻辑:
columns: [
// 合计行:自定义聚合函数(入参为全量数据)
{
title: "平均单价",
key: "price",
summary: (data) => {
const total = data.reduce((s, r) => s + r.price, 0);
return (total / data.length).toFixed(2);
},
},
// 计算列:按行自定义计算(入参为当前行与行索引)
{ title: "总成本", compute: (row) => row.price * row.qty },
{ title: "加权分", compute: (row) => row.score * row.weight + row.bonus },
];
summary传函数时优先级高于内置聚合(sum/avg/min/max/count)。compute用于按行自定义计算,与合计列的type: 'summary'(快捷求和)二选一使用。
导出数据
组件暴露 getExportData() 方法,返回结构化数据(表头 + 已解析的行数据),供宿主页面接入任意导出库:
<template>
<view>
<simplex-table ref="table" :data="tableData" :columns="columns" />
<button @click="handleExport">导出</button>
</view>
</template>
<script>
export default {
methods: {
handleExport() {
const { headers, rows } = this.$refs.table.getExportData();
// 自行将 headers/rows 转成 CSV 或 xlsx 即可
console.log(headers, rows);
},
},
};
</script>
导出会排除操作列(
type: 'action');计算列、嵌套字段、合计列的值均已通过getCellValue解析为最终显示值。
使用场景
- 数据展示:展示结构化数据,如用户列表、订单信息等
- 数据分析:展示大量数据的统计信息
- 后台管理系统:在管理后台中展示各类业务数据
- 移动端报表:在移动设备上展示报表数据
- 复杂表格:需要固定列、排序等高级功能的场景
注意事项
- 当使用固定列功能时,建议为固定列设置明确的
width - 排序功能需要在列配置中设置
sortable: true - 使用嵌套数据时,通过
key属性指定路径,如user.name - 表格高度默认为
auto,会自动计算窗口高度,也可手动指定具体数值 - 当数据为空时会显示
emptyText设置的提示信息 - 滚动加载功能需要配合
load-more和load-complete事件使用
样式自定义
组件使用了以下 UniApp 样式变量,可以通过全局样式覆盖:
$uni-bg-color- 背景色$uni-border-color- 边框颜色$uni-text-color- 文字颜色$uni-text-color-grey- 灰色文字颜色$uni-font-size-base- 基础字体大小$uni-color-primary- 主色调
可以通过覆盖这些变量来自定义组件样式。

收藏人数:
下载插件并导入HBuilderX
赞赏(3)
下载 190
赞赏 3
下载 12562137
赞赏 1948
赞赏
京公网安备:11010802035340号