更新记录
1.0.0(2026-04-25) 下载此版本
✅ 无限层级树形结构展示,子节点通过 children 字段配置
✅ 节点展开/折叠,支持递归展开/折叠指定节点及所有子节点
✅ 默认展开所有节点(defaultExpandAll)或指定节点(defaultExpandedKeys)
✅ 树形层级序号(自动生成 1、1.1、1.2 等)
✅ 最外层序号展示(可控仅顶级节点或所有行)
✅ 节点缩进可配置
平台兼容性
uni-app(3.7.10)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | √ | √ | - | √ | - | √ | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | - | - | - | - | - | - | - | - | - | - | - |
xq-tree-table 树形表格组件使用文档
xq-tree-table 是一个基于 uni-table 深度封装的树形数据表格组件,支持树形展开/折叠、自定义多选/全选/半选、层级序号、列显隐与本地存储、排序/筛选事件代理、插槽自定义等功能,适用于后台管理系统的部门、分类、组织架构等树形数据展示。
安装与引入
组件符合 easycom 规范,将 xq-tree-table 文件夹放入项目的 uni_modules 目录 中,即可在页面中直接使用,无需手动导入。
依赖
@dcloudio/uni-ui中的uni-table、uni-icons、uni-popup、uni-tooltip,请确保项目已安装这些组件。
快速开始
<template>
<xq-tree-table
v-model:columns="columns"
:table-data="treeData"
type="selection"
row-key="id"
default-expand-all
:max-height="600"
@selection-change=""
/>
</template>
<script setup>
import { ref } from 'vue'
const columns = ref([
{ prop: 'name', label: '部门名称', width: 200 },
{ prop: 'status', label: '状态', slot: 'status' },
{ prop: 'action', label: '操作', slot: 'action' }
])
const treeData = ref([
{
id: 1,
name: '总公司',
children: [
{ id: 2, name: '研发部' },
{ id: 3, name: '市场部' }
]
}
])
const = (rows) => console.log('选中行:', rows)
</script>
Props
数据与树形配置
| 参数 | 类型 | 默认值 | 必填 | 说明 |
|---|---|---|---|---|
tableData |
Array |
[] |
否 | 树形数据源 |
columns |
Array |
[] |
是 | 列配置数组(详见列配置说明) |
rowKey |
String |
- | 是 | 行数据唯一标识字段(如 'id') |
treeProps |
Object |
{ children: 'children' } |
否 | 子节点字段名 |
indentSize |
Number |
20 |
否 | 每级缩进宽度(单位 px) |
defaultExpandAll |
Boolean |
false |
否 | 是否默认展开所有节点 |
defaultExpandedKeys |
Array |
[] |
否 | 默认展开的节点 key 数组 |
表格样式
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
border |
Boolean |
true |
是否显示纵向边框 |
stripe |
Boolean |
true |
是否显示斑马纹 |
loading |
Boolean |
false |
是否显示加载中状态(外部控制) |
emptyText |
String |
'暂无数据' |
空数据时的提示文本 |
多选配置
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
type |
String |
'' |
设为 'selection' 时开启多选列 |
selectionKey |
String |
'_checked' |
选中状态在行数据中的字段名 |
selectionWidth |
String |
'40rpx' |
多选列宽度 |
序号列
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
index |
Boolean |
true |
是否显示最外层序号列 |
isRowIndex |
Boolean |
false |
为 true 时每一行都显示扁平序号(1,2,3…),为 false 时仅顶级节点显示序号,子节点为空 |
indexWidth |
String |
'100rpx' |
序号列宽度 |
indexLabel |
String |
'序号' |
序号列表头文字 |
树形序号列
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
treeIndex |
Boolean |
true |
是否显示树形层级序号(如 1.1、1.2) |
treeIndexWidth |
String |
'150rpx' |
树形序号列宽度 |
treeIndexLabel |
String |
'树形序号' |
树形序号列表头文字 |
列显隐与本地存储
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
localColumnKeys |
String |
'' |
本地存储的 key,传入后列配置会自动保存/读取 |
showColumnSettings |
Boolean |
true |
是否显示右上角齿轮图标(列设置入口) |
行高亮与固定高度
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
highlightColor |
String |
'#e6f7ff' |
行点击高亮的背景色 |
maxHeight |
Number |
0 |
表格内容区域的最大高度(单位 rpx),设置后表头固定,表体滚动;设为 0 或空则不限制高度 |
Events
| 事件名 | 参数 | 说明 |
|---|---|---|
selection-change |
(rows) |
选中行变化时触发,返回选中的行数组 |
sort-change |
{ column, event } |
点击排序时触发 |
filter-change |
{ column, event } |
筛选条件变化时触发 |
expand-change |
(row, expanded) |
节点展开或折叠时触发 |
row-click |
(row, key) |
点击行时触发 |
update:columns |
(newColumns) |
列配置变化时触发(用于 v-model) |
Slots
表头插槽 header
通过列配置的 thSlot 字段启用,可自定义表头内容。作用域参数:{ column, cIdx }
<template #header="{ column, cIdx }">
<text>{{ column.label }} (自定义)</text>
</template>
单元格插槽 cell
用于自定义单元格内容,所有数据列统一使用静态插槽名 cell。作用域参数:{ row, column, rowIndex, isExpandedCell }
其中 column 为列原始配置对象,可通过 column.prop 区分不同列。
<template #cell="{ row, column }">
<template v-if="column.prop === 'status'">
<u-tag :text="row.status === '0' ? '启用' : '禁用'" />
</template>
<template v-else-if="column.prop === 'action'">
<button @click="handleEdit(row)">
编辑
</button>
</template>
</template>
如果没有提供
#cell插槽,组件会自动根据tooltip配置显示默认文本或气泡提示。
列配置
每个列对象支持以下属性(除 prop 和 label 外均为可选):
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
prop |
String |
- | 对应行数据的字段名(必填) |
label |
String |
- | 表头显示文字(必填) |
width |
Number |
- | 列宽(单位 px) |
minWidth |
Number |
- | 最小宽度(单位 rpx) |
align |
String |
- | 同时设置表头和内容对齐方式(left/center/right) |
thAlign |
String |
'center' |
表头单独对齐方式 |
tdAlign |
String |
'left' |
单元格内容单独对齐方式 |
sortable |
Boolean |
false |
是否可排序 |
filterType |
String |
- | 筛选类型(如 'select') |
filterData |
Array |
- | 筛选选项数据 [{text, value}] |
tooltip |
Boolean |
true |
内容溢出时是否显示气泡提示 |
events |
Object |
- | 列级事件回调,键为事件名(如 'sort-change'),值为函数 |
slot |
String |
- | 自定义单元格插槽标识(需配合 #cell 使用) |
thSlot |
String |
'' |
自定义表头插槽标识(非空时启用 header 插槽) |
visible |
Boolean |
true |
是否显示该列 |
disabled |
Boolean |
false |
在列显隐弹窗中是否禁止取消勾选 |
默认第一列为树形列,会额外显示展开/折叠图标及缩进。
events 示例:
{
prop: 'postId',
label: '岗位编号',
sortable: true,
events: {
'sort-change': ({ column, event }) => {
console.log('排序变化', event.order)
}
}
}
方法 (通过 ref 调用)
| 方法名 | 参数 | 说明 |
|---|---|---|
clearSelection() |
- | 清空所有选中行 |
selectionAll() |
- | 选中所有行 |
toggleAllSelection() |
- | 反转所有行的选中状态 |
getSelectionRows() |
- | 获取当前选中的行数组 |
toggleRowSelection(row, selected?) |
row: 行对象selected: 可选,强制指定选中状态 |
切换指定行的选中状态 |
clearHighlight() |
- | 清除行高亮 |
getHighlightRow() |
- | 获取当前高亮的行数据 |
expandAll() |
- | 展开所有节点 |
collapseAll() |
- | 折叠所有节点 |
expandNode(row) |
- | 展开指定节点 |
collapseNode(row) |
- | 折叠指定节点 |
expandNodeAndChildren(row) |
- | 展开指定节点及其所有子节点 |
collapseNodeAndChildren(row) |
- | 折叠指定节点及其所有子节点 |
toggleExpandNode(row) |
- | 切换指定节点的展开/折叠状态 |
getExpandedKeys() |
- | 返回当前展开的节点 key 数组 |
getExpandedState() |
- | 返回展开状态对象(只读) |
getTableInstance() |
- | 获取内部 uni-table 组件实例 |
列显隐与本地存储
传入 local-column-keys="my_table",用户勾选列后自动存入本地缓存,刷新页面后列配置会恢复。
<xq-tree-table local-column-keys="my_table_columns" ... />
在列配置弹窗中,被 disabled 的列将无法取消勾选(例如操作列常用)。
完整示例
<script setup>
import { ref } from 'vue'
const tableRef = ref(null)
// 可以直接将事件写在column得events中
const columns = ref([
{ prop: 'name', label: '部门名称', width: 200 },
{
prop: 'status',
label: '状态',
slot: 'status', // 使用插槽自定义内容
visible: true,
filterType: 'select', // 筛选类型为下拉
filterData: [ // 下拉的内容
{ text: '全部', value: '' },
{ text: '启用', value: '0' },
{ text: '禁用', value: '1' }
],
events: {
'filter-change': ({ column, event }) => {
console.log('筛选值', event.value)
}
}
},
{ prop: 'action', label: '操作', slot: 'action', width: 150, disabled: true }
])
// 或者将columns放到配置文件中,这么写也可以
import { tableColumns } from './xxx.js'
// 定义事件处理器(只关注业务逻辑)
const eventHandlers = {
postId: {
'sort-change': (e) => {
console.log('岗位编号排序', e)
// 直接调用接口、更新 state
},
},
status: {
'filter-change': (e) => {
console.log('岗位状态过滤', e)
// 直接调用接口、更新 state
},
},
}
// 最好是做一个深拷贝, 确保不会影响其他页面的引用
const columns = ref(
tableColumns.map(col => ({ ...col, events: eventHandlers[col.prop] || col.events || {} })),
)
---
const treeData = ref([
{
id: 1,
name: '总公司',
status: '0',
children: [
{ id: 2, name: '研发部', status: '1' },
{ id: 3, name: '市场部', status: '0' }
]
}
])
const = rows => console.log('选中:', rows)
const onRowClick = row => console.log('点击行:', row)
function handleEdit(row) { /* 编辑逻辑 */ }
function handleDelete(row) { /* 删除逻辑 */ }
// 调用暴露方法
const selectAll = () => tableRef.value.selectionAll()
</script>
<template>
<xq-tree-table
ref="tableRef"
v-model:columns="columns"
:table-data="treeData"
type="selection"
row-key="id"
:max-height="500"
local-column-keys="demo_tree"
@selection-change=""
@row-click="onRowClick"
>
<template #cell="{ row, column }">
<template v-if="column.prop === 'status'">
<u-tag :text="row.status === '0' ? '启用' : '禁用'" />
</template>
<template v-else-if="column.prop === 'action'">
<button @click="handleEdit(row)">
编辑
</button>
<button @click="handleDelete(row)">
删除
</button>
</template>
</template>
</xq-tree-table>
</template>
平台兼容性
| 平台 | 支持情况 |
|---|---|
| H5 | ✅ |
| 微信小程序 | ✅(插槽需使用 #cell 静态名称) |
| App-Vue | ✅ |
| App-nvue | ⚠️ 基本可用,部分 CSS 动画可能受限 |
| 其他小程序 | - |
依赖说明
uni-table/uni-tr/uni-th/uni-tduni-iconsuni-popupuni-tooltip
以上组件均包含在 @dcloudio/uni-ui 中,请确保项目已安装。
文档版本:v1.0.0 最后更新:2026-04-25

收藏人数:
下载插件并导入HBuilderX
下载示例项目ZIP
赞赏(0)
下载 9
赞赏 0
下载 11677765
赞赏 1908
赞赏
京公网安备:11010802035340号