更新记录
1.1.4(2026-09-22) 下载此版本
优化图标样式
1.1.3(2026-09-21) 下载此版本
修复节点展开问题
1.1.2(2026-09-07) 下载此版本
修改说明
查看更多平台兼容性
uni-app(3.8.4)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | - | √ | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | - | - | - | - | - | - | - | - | - | - | - |
lu-data-tree
uni-app 树形选择组件,支持单选、多选、父子级联、严格模式、节点禁用、懒加载、关键词筛选、默认展开及自定义节点插槽。
该组件基于 da-tree 树形选择 进行修改
特性
- 支持 Vue 2 和 Vue 3
- 支持单选和多选
- 支持父子节点联动及严格模式
- 支持半选状态
- 支持默认选中和默认展开
- 支持节点禁用
- 支持异步懒加载
- 支持关键词筛选
- 支持自定义节点内容
- 支持实例方法控制选中和展开状态
- 支持大数据量增量渲染
安装
将 lu-data-tree 放入项目的 uni_modules 目录,并确保项目中已安装 uni-icons。
组件支持 easycom,通常无需手动导入:
<lu-data-tree :data="treeData" />
基础用法
<template>
<lu-data-tree
:data="treeData"
labelField="name"
valueField="id"
@change="handleChange"
@expand="handleExpand"
/>
</template>
<script setup>
import { ref } from 'vue';
const treeData = ref([
{
id: '1',
name: '一级节点',
children: [
{ id: '1-1', name: '二级节点' }
]
}
]);
function handleChange(keys, currentNode) {
console.log(keys, currentNode);
}
function handleExpand(expanded, currentNode) {
console.log(expanded, currentNode);
}
</script>
属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
data |
Array |
[] |
树形数据 |
themeColor |
String |
#007aff |
选中状态主题色 |
showCheckbox |
Boolean |
false |
是否启用多选;关闭时为单选 |
showCount |
Boolean |
false |
是否显示当前节点的直接子节点数量 |
defaultCheckedKeys |
Array \| String \| Number |
null |
默认选中节点;单选传单个 key,多选传 key 数组 |
defaultExpandAll |
Boolean |
false |
是否默认展开全部节点 |
defaultExpandedKeys |
Array |
null |
默认展开的节点 key 数组 |
expandChecked |
Boolean |
false |
选中节点时是否自动展开到该节点 |
checkStrictly |
Boolean |
false |
多选时是否关闭默认父子联动 |
autoCheckAllChildren |
Boolean |
false |
严格模式下,选中节点时是否选中全部子孙节点 |
autoUncheckAllChildren |
Boolean |
false |
严格模式下,取消节点时是否取消全部子孙节点 |
autoCheckAllParent |
Boolean |
false |
严格模式下,选中节点时是否选中全部祖先节点 |
autoUnCheckAllParent |
Boolean |
false |
严格模式下,取消节点时是否取消全部祖先节点 |
showRadioIcon |
Boolean |
true |
单选模式下是否显示单选图标 |
onlyRadioLeaf |
Boolean |
false |
单选时是否只允许选中叶子节点 |
indent |
Number |
40 |
层级缩进距离,单位为 rpx |
checkboxPlacement |
String |
left |
选择图标位置,可选 left 或 right |
loadMode |
Boolean |
false |
是否启用懒加载模式;空子节点也显示展开图标 |
loadApi |
Function |
null |
懒加载函数,接收当前节点并返回子节点数组;无子节点时可返回空数组 |
alwaysFirstLoad |
Boolean |
false |
是否每次展开都重新调用懒加载函数 |
checkedDisabled |
Boolean |
false |
是否允许处理禁用节点的选中状态 |
packDisabledkey |
Boolean |
true |
获取选中 key 时是否包含禁用节点 |
isLeafFn |
Function |
null |
自定义叶子节点判断函数,接收原始节点并返回布尔值 |
filterValue |
String |
'' |
筛选关键词,按节点标签进行包含匹配 |
labelField |
String |
label |
节点标签字段名 |
valueField |
String |
value |
节点唯一值字段名,要求全树唯一 |
childrenField |
String |
children |
子节点字段名 |
disabledField |
String |
disabled |
禁用状态字段名 |
appendField |
String |
append |
节点副标签字段名 |
leafField |
String |
leaf |
叶子节点标记字段名 |
sortField |
String |
sort |
同级节点排序字段名 |
选择模式
单选
默认关闭 showCheckbox,组件处于单选模式:
<lu-data-tree
:data="treeData"
defaultCheckedKeys="1-1"
@change="handleChange"
/>
单选事件中的第一个参数为单个 key;取消选中时为 null。
多选
<lu-data-tree
:data="treeData"
showCheckbox
:defaultCheckedKeys="['1-1']"
@change="handleChange"
/>
默认情况下父子节点联动。选中父节点会联动选中可用子孙节点,子节点部分选中时父节点显示半选状态。
严格模式
开启 checkStrictly 后,默认父子联动关闭。此时每个节点只能处于未选中或选中状态,不会产生半选状态。需要联动时,可按需开启以下配置:
<lu-data-tree
:data="treeData"
showCheckbox
checkStrictly
autoCheckAllChildren
autoUncheckAllChildren
autoCheckAllParent
autoUnCheckAllParent
/>
懒加载
<lu-data-tree
:data="treeData"
loadMode
:loadApi="loadChildren"
/>
async function loadChildren(node) {
const children = await fetchChildren(node.key);
return children || [];
}
loadApi 接收处理后的当前节点。返回值应为子节点数组;没有子节点时返回 []。组件会根据 childrenField 合并并插入新节点。
筛选
<template>
<input v-model="keyword" placeholder="请输入关键词" />
<lu-data-tree :data="treeData" :filterValue="keyword" />
</template>
<script setup>
import { ref } from 'vue';
const keyword = ref('');
</script>
匹配节点及其祖先节点会显示。清空关键词后,组件会恢复筛选前的展开状态。
懒加载模式下,筛选范围仅包含已经加载到组件中的节点。
事件
| 事件 | 回调参数 | 说明 |
|---|---|---|
change |
(checkedKeys, currentNode) |
选中状态变化时触发;单选取消时 checkedKeys 为 null |
expand |
(expanded, currentNode) |
节点展开或收起时触发;expanded 为布尔值 |
currentNode 为组件处理后的内部节点,其中 originItem 保存原始数据节点。
实例方法
通过 ref 获取组件实例:
<lu-data-tree ref="treeRef" :data="treeData" showCheckbox />
const treeRef = ref(null);
treeRef.value?.setCheckedKeys(['1-1'], true);
treeRef.value?.setExpandedKeys(['1'], true);
const checkedKeys = treeRef.value?.getCheckedKeys();
const expandedKeys = treeRef.value?.getExpandedKeys();
| 方法 | 参数 | 说明 |
|---|---|---|
setCheckedKeys |
(keys, checked) |
设置节点选中状态;单选 keys 为 key,多选为 key 数组 |
setExpandedKeys |
(keys, expand) |
设置节点展开状态;keys 为 key 数组或 'all' |
getCheckedKeys |
- | 获取已选中的 key |
getHalfCheckedKeys |
- | 获取半选中的 key |
getUncheckedKeys |
- | 获取未选中的 key |
getCheckedNodes |
- | 获取已选中的内部节点 |
getHalfCheckedNodes |
- | 获取半选中的内部节点 |
getUncheckedNodes |
- | 获取未选中的内部节点 |
getExpandedKeys |
- | 获取已展开的 key |
getUnexpandedKeys |
- | 获取未展开的 key |
getExpandedNodes |
- | 获取已展开的内部节点 |
getUnexpandedNodes |
- | 获取未展开的内部节点 |
getNodeByKey |
(key) |
根据 key 获取内部节点;找不到时返回 undefined |
自定义节点内容
组件提供默认插槽,插槽参数如下:
node:组件处理后的内部节点data:原始数据节点
<lu-data-tree :data="treeData">
<template #default="{ node, data }">
<view class="custom-node">
<text>{{ node.label }}</text>
<text v-if="data.description">{{ data.description }}</text>
</view>
</template>
</lu-data-tree>
## 空状态插槽
组件提供两个空状态插槽,插槽内容均完全由调用方控制,不会自动附加组件空状态样式:
- `empty`:传入的树形数据为空时使用
- `search-empty`:搜索完成且没有匹配节点时使用
未提供插槽时,分别显示“暂无数据”和“未匹配到数据”。
```vue
<lu-data-tree :data="treeData" :filterValue="filterValue">
<template #empty>
<view class="custom-empty">暂无组织数据</view>
</template>
<template #search-empty>
<view class="custom-search-empty">没有找到相关节点</view>
</template>
</lu-data-tree>
节点数据结构
默认字段结构如下:
[
{
value: '1',
label: '一级节点',
disabled: false,
leaf: false,
children: [
{
value: '1-1',
label: '二级节点'
}
]
}
]
使用自定义字段时:
<lu-data-tree
:data="treeData"
labelField="name"
valueField="id"
childrenField="nodes"
/>
valueField 对应的值必须在整棵树中唯一,否则节点选中、展开和实例查询可能产生冲突。
注意事项
- 组件依赖
uni-icons。 loadMode必须同时传入有效的loadApi函数。loadApi应返回数组;无子节点时返回[]。onlyRadioLeaf与懒加载组合时无法判断尚未加载节点是否为叶子节点。- 父容器应设置明确高度,否则
scroll-view的百分比高度可能无法正常显示。 - 当前组件适用于普通 uni-app Vue2/Vue3 项目,不适用于 uni-app x。
- 组件声明支持的平台以
package.json为准。

收藏人数:
https://gitee.com/lu-my/lu-data-tree.git
下载插件并导入HBuilderX
下载示例项目ZIP
赞赏(0)
下载 380
赞赏 1
下载 12649200
赞赏 1953
赞赏
京公网安备:11010802035340号