更新记录
1.0.0(2026-02-02)
下载此版本
- 基础树形展示:支持多层级数据展示,展开/折叠。
- 自定义插槽:支持自定义节点内容和图标。
- 拖拽排序:支持长按节点进行拖拽排序(可开关)。
- 选择功能:支持复选框(Checkbox)和单选框(Radio)模式。
- 父子联动:复选框模式下支持父子节点选中状态联动(可配置独立选择)。
- 操作交互:内置编辑和删除按钮操作。
- 样式美观:简洁现代的 UI 设计,支持半选状态(Indeterminate)。
平台兼容性
uni-app(3.6.16)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
x-tree 树形组件
x-tree 是一个功能丰富的 Vue 2 树形组件,专为 Uni-app 开发。它支持自定义节点、图标、拖拽排序(长按)、节点编辑/删除、复选框/单选框选择等功能。
功能特性
- 基础树形展示:支持多层级数据展示,展开/折叠。
- 自定义插槽:支持自定义节点内容和图标。
- 拖拽排序:支持长按节点进行拖拽排序(可开关)。
- 选择功能:支持复选框(Checkbox)和单选框(Radio)模式。
- 父子联动:复选框模式下支持父子节点选中状态联动(可配置独立选择)。
- 操作交互:内置编辑和删除按钮操作。
- 样式美观:简洁现代的 UI 设计,支持半选状态(Indeterminate)。
引入组件
在 pages.json 中配置 easycom 或在页面中手动引入:
import xTree from '@/components/x-tree/x-tree.vue';
export default {
components: {
xTree
}
}
基本用法
<template>
<x-tree
:data="treeData"
:check-type="'checkbox'"
:draggable="true"
@edit="handleEdit"
@delete="handleDelete"
@node-drop="handleDrop"
@check-change="handleCheckChange"
>
</x-tree>
</template>
API
Props 属性
| 参数 |
说明 |
类型 |
默认值 |
data |
树形结构数据源 |
Array |
[] |
itemHeight |
每一行的高度 (px) |
Number |
48 |
checkType |
选择类型,可选值 'checkbox' (复选), 'radio' (单选), '' (无) |
String |
'' |
checkStrictly |
在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 false (即父子联动) |
Boolean |
false |
draggable |
是否开启长按拖拽排序功能 |
Boolean |
false |
Events 事件
| 事件名 |
说明 |
回调参数 |
edit |
点击编辑按钮触发 |
item: 当前节点数据对象 |
delete |
点击删除按钮触发 |
item: 当前节点数据对象 |
node-drop |
拖拽结束触发 |
{ source, target, position }: 源节点,目标节点,位置('before'|'after') |
check-change |
勾选状态改变时触发 |
checkbox: { checked, item, checkedKeys, checkedNodes }
radio: { checked, item, checkedKeys } |
Slots 插槽
| 插槽名 |
说明 |
作用域参数 |
icon |
自定义节点左侧图标 |
{ item }: 当前节点数据 |
default |
自定义节点内容(文本区域) |
{ item }: 当前节点数据 |
插槽示例
<x-tree :data="list">
<!-- 自定义图标 -->
<template v-slot:icon="{ item }">
<text v-if="item.type === 'folder'">📂</text>
<text v-else>📄</text>
</template>
<!-- 自定义内容 -->
<template v-slot:default="{ item }">
<text style="color: blue;">{{ item.label }}</text>
<text style="font-size: 10px; color: #999;">(ID: {{ item.id }})</text>
</template>
</x-tree>
数据结构 (Data Prop)
data 属性接受一个对象数组,每个对象应包含以下字段:
[
{
id: 1, // 唯一标识
label: 'Node 1', // 显示文本
expanded: true, // 是否展开 (可选, 默认 true)
checked: false, // 是否选中 (可选)
children: [ // 子节点数组
{
id: 11,
label: 'Child 1-1'
}
]
}
]
注意事项
- 拖拽排序:开启
draggable 后,用户需长按节点约 300ms 触发拖拽状态。
- 样式定制:组件内部使用了 scoped 样式,如需覆盖请使用深度选择器
::v-deep。
- 性能:组件内部将树形数据扁平化为列表渲染,以优化长列表性能并简化拖拽计算。