更新记录

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-tableuni-iconsuni-popupuni-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.11.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 配置显示默认文本或气泡提示。


列配置

每个列对象支持以下属性(除 proplabel 外均为可选):

属性 类型 默认值 说明
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-td
  • uni-icons
  • uni-popup
  • uni-tooltip

以上组件均包含在 @dcloudio/uni-ui 中,请确保项目已安装。


文档版本:v1.0.0 最后更新:2026-04-25

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。