更新记录
1.0.0(2026-04-28)
下载此版本
更新日志
[1.0.0] - 2026-04-28
平台兼容性
uni-app(4.11)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| - |
√ |
√ |
- |
√ |
- |
- |
- |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
xq-tree-select 树形选择器组件文档
组件概述
xq-tree-select 是一个基于 uni-app 的树形下拉选择器,内部封装了树组件,支持单选与多选、可搜索过滤、自定义节点渲染、底部确认/取消按钮以及多选标签展示等功能。已适配 H5、微信小程序、App 等多种平台。
引入方式
在页面或组件中通过 import 引入并注册即可使用。
<script setup>
import XqTreeSelect from '@/uni_modules/xq-tree-select/components/xq-tree-select/xq-tree-select.vue'
</script>
<template>
<XqTreeSelect v-model="selectedValue" :data="treeData" />
</template>
基础用法
单选模式
<script setup>
import { ref } from 'vue'
const selectedId = ref('')
const treeData = ref([
{
id: '1',
name: '一级节点',
children: [
{ id: '1-1', name: '二级节点' }
]
}
])
</script>
<template>
<xq-tree-select
v-model="selectedId"
:data="treeData"
node-key="id"
label-key="name"
placeholder="请选择部门"
/>
</template>
多选模式(带底部确认按钮)
<template>
<xq-tree-select
v-model="checkedKeys"
:data="treeData"
multiple
show-footer
confirm-text="确认选择"
cancel-text="取消"
:tag-limit="3"
/>
</template>
<script setup>
import { ref } from 'vue'
const checkedKeys = ref([])
const treeData = ref([...])
</script>
可搜索模式
<template>
<xq-tree-select
v-model="selectedId"
:data="treeData"
filterable
filter-placeholder="输入关键字搜索"
/>
</template>
自定义节点内容
通过 show-custom-node 开启自定义节点插槽,使用具名插槽 #node 接收节点数据。
<template>
<xq-tree-select
v-model="selectedId"
:data="treeData"
show-custom-node
>
<template #node="{ node, level, expanded }">
<view style="display: flex; align-items: center;">
<text>{{ node.label }}</text>
<text style="color: #999;">
(层级:{{ level }})
</text>
</view>
</template>
</xq-tree-select>
</template>
Props
| 参数 |
类型 |
默认值 |
说明 |
data |
Array |
[] |
树形数据源 |
nodeKey |
String |
'id' |
节点唯一标识字段名 |
labelKey |
String |
'label' |
节点显示文本字段名 |
childrenKey |
String |
'children' |
子节点字段名 |
modelValue |
String / Number / Array |
— |
绑定值,单选时为 string/number,多选时必为数组 |
placeholder |
String |
'请选择' |
未选择时的占位提示文字 |
disabled |
Boolean |
false |
是否禁用 |
clearable |
Boolean |
true |
是否显示清空按钮 |
multiple |
Boolean |
false |
是否多选 |
showCheckbox |
Boolean |
true |
节点前是否显示复选框 |
checkStrictly |
Boolean |
false |
是否严格模式(父子不关联) |
filterable |
Boolean |
false |
是否可搜索过滤 |
filterPlaceholder |
String |
'输入关键字进行过滤' |
搜索框占位文字 |
filterMethod |
Function |
null |
自定义过滤函数 |
defaultExpandedKeys |
Array |
[] |
默认展开的节点 key 数组 |
accordion |
Boolean |
false |
是否手风琴模式(同级只展开一个) |
indent |
Number |
20 |
节点缩进距离(rpx) |
emptyText |
String |
'暂无数据' |
无数据时的提示文字 |
maxHeight |
Number |
400 |
下拉面板内容区的最大高度(px),超出滚动 |
placement |
String |
'auto' |
弹出方向,可选 'auto'、'top'、'bottom' |
showFooter |
Boolean |
false |
是否显示底部确认/取消按钮 |
confirmText |
String |
'确定' |
确认按钮文字 |
cancelText |
String |
'取消' |
取消按钮文字 |
tagLimit |
Number |
5 |
多选时选择器内最多显示的标签数量,超出会显示 +N |
showCustomNode |
Boolean |
false |
是否开启自定义节点插槽 |
treeHeight |
Number |
400 |
内部树组件的高度(px) |
Events
| 事件名 |
回调参数 |
说明 |
update:modelValue |
value |
绑定值更新时触发(支持 v-model) |
change |
value |
选中值发生变化时触发,参数与 update:modelValue 相同 |
node-click |
node |
点击树节点时触发,参数为节点对象 |
node-expand |
node |
节点展开时触发 |
node-collapse |
node |
节点折叠时触发 |
Slots
| 插槽名 |
作用域数据 |
说明 |
title |
— |
自定义下拉面板顶部标题区域,默认显示“请选择” |
node |
{ node, level, expanded } |
自定义节点内容,配合 showCustomNode 使用。node 为当前节点完整数据;data 为整个树数据;level 为当前节点层级;expanded 为是否展开 |
注意事项
- 数据格式:
data 中的每一项必须包含 nodeKey 和 labelKey 指定的字段,子节点通过 childrenKey 指定。
- 多选绑定:多选模式下
modelValue 必须是数组类型,否则无法正常显示标签。
- 搜索过滤:
filterMethod 为自定义过滤函数,若不传则使用组件内置的标签匹配过滤(递归匹配 label)。
- 底部按钮逻辑:当
showFooter 为 true 时,只有点击“确定”按钮才会更新绑定值;点击“取消”或蒙层会恢复到弹窗打开前的选中状态。若为 false,则选中操作立即生效。
- 自适应弹出方向:
placement="auto" 时,组件会根据触发元素距离屏幕底部和顶部的距离自动选择向上或向下弹出。
- 严格模式:
checkStrictly 为 true 时,父节点与子节点的选中状态互不影响;否则勾选父节点会同时勾选全部后代。
- 自定义节点:使用
showCustomNode 时,必须显式设置该属性为 true,插槽内容才会渲染。插槽作用域中 node.label 已被映射为对应 labelKey 字段的值。
- 小程序样式:请勿在组件内添加小程序不支持的 CSS 选择器或属性;若需全局设置盒模型,请在
App.vue 中按上述条件编译方式处理。
完整示例
<script setup>
import { ref } from 'vue'
import XqTreeSelect from '@/uni_modules/xq-tree-select/components/xq-tree-select/xq-tree-select.vue'
const selected = ref([])
const treeData = ref([
{
menuId: '1',
menuName: '系统管理',
children: [
{ menuId: '1-1', menuName: '用户管理' },
{ menuId: '1-2', menuName: '角色管理' }
]
}
])
function handleChange(val) {
console.log('选中值变化:', val)
}
</script>
<template>
<view class="page">
<xq-tree-select
v-model="selected"
:data="treeData"
node-key="menuId"
label-key="menuName"
multiple
filterable
show-footer
show-custom-node
@change="handleChange"
>
<template #node="{ node }">
<view style="display: flex; align-items: center;">
<text>{{ node.label }}</text>
</view>
</template>
</xq-tree-select>
</view>
</template>