更新记录

1.0.0(2026-10-12) 下载此版本

  • 首个版本
  • 弹出层内树形展示,支持多层级展开 / 收起
  • 关键字模糊搜索,命中节点自动保留祖先链并展开
  • 支持手风琴模式(同级只展开一个)
  • 支持仅选择叶子节点
  • 支持字段映射(label / children / disabled),适配任意数据结构
  • 支持自定义回显文案(labelFormatter)与自定义校验(validator,支持 Promise)
  • 支持一键清除、整体禁用、初始展开全部
  • v-model 双向绑定,Vue2 / Vue3 双兼容

平台兼容性

uni-app(5.0)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
√ √ √ √ √ - √ √ √
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
√ √ √ √ - - - √ - - - -

uni-app x(5.0)

Chrome Safari Android iOS 鸿蒙 微信小程序
√ √ √ √ √ √

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× × √ ×

Rui-selectSearchTree 可搜索树形选择器

通用的树形选择组件:输入框样式的选择框 + 底部弹出层内的树形列表,支持模糊搜索、展开收起,开箱即用。

组件不依赖任何业务接口或数据格式,通过 data 传入树形数据即可,用法与 element-plus 的 TreeSelect 类似。

功能特性

  • 弹出层内树形展示,支持任意层级、展开 / 收起
  • 关键字模糊搜索,命中节点的祖先链自动保留并展开
  • 支持手风琴模式(同级节点每次只展开一个)
  • 支持「仅选择叶子节点」模式
  • 字段映射 props(label / children / disabled),适配任意数据结构
  • 支持自定义回显文案 labelFormatter 与自定义校验 validator(支持 Promise)
  • 支持一键清除、整体禁用、初始展开全部
  • v-model 双向绑定,Vue2、Vue3 项目均可直接使用,无需适配
  • 已选值在打开弹窗时自动展开祖先链并滚动定位

安装

在插件市场点击「使用 HBuilderX 导入插件」即可。依赖的 uni-easyinput、uni-popup、uni-icons 会由 HBuilderX 自动安装。

组件符合 easycom 规范,无需 import、无需注册,模板中直接使用。

数据格式

默认节点字段为 id / label / children / disabled:

const treeData = [
  {
    id: '1',
    label: '总部',
    children: [
      { id: '1-1', label: '研发中心' },
      { id: '1-2', label: '市场中心', children: [{ id: '1-2-1', label: '华东大区' }] }
    ]
  }
]

若你的字段名不同,通过 props 映射:

<Rui-selectSearchTree v-model="orgId" :data="treeData"
  nodeKey="orgId"
  :props="{ label: 'orgName', children: 'children', disabled: 'isDisabled' }" />

快速上手

<!-- 最简用法 -->
<Rui-selectSearchTree v-model="form.orgId" :data="treeData" />

<!-- 手风琴模式 + 初始展开全部 -->
<Rui-selectSearchTree v-model="form.orgId" :data="treeData" accordion expand-all />

<!-- 仅允许选择叶子节点 -->
<Rui-selectSearchTree v-model="form.orgId" :data="treeData" only-leaf />

<!-- 自定义标题、占位与搜索框占位 -->
<Rui-selectSearchTree v-model="form.orgId" :data="treeData"
  title="选择组织机构" placeholder="请选择组织机构" search-placeholder="输入机构名称筛选" />

<!-- 不可清除 + 禁用 -->
<Rui-selectSearchTree v-model="form.orgId" :data="treeData" :clearable="false" disabled />

<!-- 自定义回显:带上级路径 -->
<Rui-selectSearchTree v-model="form.orgId" :data="treeData" :label-formatter="formatLabel" />

自定义回显与校验

export default {
  methods: {
    // node:当前节点;path:祖先节点数组(从根到父级)
    formatLabel(node, path) {
      const prefix = path.map(n => n.label).join('/')
      return prefix ? `${prefix}/${node.label}` : node.label
    },
    // 返回 false 阻止确定;抛错也会阻止确定;支持返回 Promise
    async validate(node) {
      if (node.disabledFlag) {
        uni.showToast({ title: '该节点不可选', icon: 'none' })
        return false
      }
      return true
    }
  }
}

Props

属性名 类型 默认值 说明
value / modelValue String / Number '' v-model 绑定值(节点唯一标识),Vue2 / Vue3 均直接使用
data Array [] 树形数据源
nodeKey String 'id' 节点唯一标识字段名,选中值即该字段的值
props Object { label: 'label', children: 'children', disabled: 'disabled' } 字段映射,用法与 element-plus TreeSelect 一致
title String '请选择' 弹窗标题
placeholder String '请选择' 选择框占位文案,未选择时的提示
searchPlaceholder String '输入关键字筛选' 搜索框占位文案
emptyText String '暂无数据' 树为空时的提示文案
clearable Boolean true 是否可一键清除已选值
disabled Boolean false 整体禁用
accordion Boolean false 手风琴模式,同级节点每次只展开一个
onlyLeaf Boolean false 仅允许选择叶子节点,点击父节点只做展开 / 收起
expandAll Boolean false 初始展开全部节点
validator Function null 自定义校验,返回 false 或抛错阻止确定,支持 Promise
labelFormatter Function null 自定义回显文案 (node, path) => string

Events

事件名 参数 说明
change (value, node) 确定或清除时触发
confirm (value, node) 点击确定且校验通过后触发
input (value) Vue2 v-model 内部事件
update:modelValue (value) Vue3 v-model 内部事件

使用说明

  • 选中值 v-model 存储的是节点的 nodeKey 字段值;change / confirm 事件会额外回传完整节点对象
  • 搜索时会忽略手动展开状态,命中节点的祖先链自动展开;清空关键字后恢复手动展开状态
  • 打开弹窗时会自动展开已选节点的祖先链并滚动定位到该节点
  • onlyLeaf 为 true 时,父节点仅用于展开 / 收起,不可被选中
  • 清除操作会触发 change,参数为 ('', null)

兼容性

  • 支持:App(vue 页面)、H5、微信 / 支付宝 / 百度 / 字节跳动 / QQ 小程序
  • 不支持:nvue 页面
  • Vue2、Vue3 项目均支持

隐私、权限声明

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

无

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

无

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

无

许可协议

MIT License

Copyright (c) 2026 Rui

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.