更新记录

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 对应的值必须在整棵树中唯一,否则节点选中、展开和实例查询可能产生冲突。

注意事项

  1. 组件依赖 uni-icons。
  2. loadMode 必须同时传入有效的 loadApi 函数。
  3. loadApi 应返回数组;无子节点时返回 []。
  4. onlyRadioLeaf 与懒加载组合时无法判断尚未加载节点是否为叶子节点。
  5. 父容器应设置明确高度,否则 scroll-view 的百分比高度可能无法正常显示。
  6. 当前组件适用于普通 uni-app Vue2/Vue3 项目,不适用于 uni-app x。
  7. 组件声明支持的平台以 package.json 为准。

隐私、权限声明

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

无

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

无

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

无

许可协议

MIT协议