更新记录

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 为是否展开

注意事项

  1. 数据格式data 中的每一项必须包含 nodeKeylabelKey 指定的字段,子节点通过 childrenKey 指定。
  2. 多选绑定:多选模式下 modelValue 必须是数组类型,否则无法正常显示标签。
  3. 搜索过滤filterMethod 为自定义过滤函数,若不传则使用组件内置的标签匹配过滤(递归匹配 label)。
  4. 底部按钮逻辑:当 showFootertrue 时,只有点击“确定”按钮才会更新绑定值;点击“取消”或蒙层会恢复到弹窗打开前的选中状态。若为 false,则选中操作立即生效。
  5. 自适应弹出方向placement="auto" 时,组件会根据触发元素距离屏幕底部和顶部的距离自动选择向上或向下弹出。
  6. 严格模式checkStrictlytrue 时,父节点与子节点的选中状态互不影响;否则勾选父节点会同时勾选全部后代。
  7. 自定义节点:使用 showCustomNode 时,必须显式设置该属性为 true,插槽内容才会渲染。插槽作用域中 node.label 已被映射为对应 labelKey 字段的值。
  8. 小程序样式:请勿在组件内添加小程序不支持的 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>

隐私、权限声明

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

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

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

许可协议

MIT协议

暂无用户评论。