更新记录
1.0.1(2026-10-17)
- 修复已知问题。
1.0.0(2026-10-17)
- uni-appx的树形组件,支持文件目录展示、单选多选、父子联动、展开折叠、手风琴模式、节点过滤及虚拟滚动,可自定义图标、连线、样式和数据字段,构建清晰流畅的层级数据交互界面。
平台兼容性
uni-app x(4.86)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
umi-treeview-x
特别说明:
魔法上网35元/月,有需求的可以联系我(稳定,支持 Clash Verge)。售卖CodeX账号,plus代充180元/月,有需求的可以联系我。售卖Claude Code账号以及代充,有需求的可以联系我。vx: 781284440
默认外观和点击行为沿用官方文件树,通过 option 可配置图标、间距和选中背景;通过 show-checkbox 显示多选框,通过顶层 multiple 控制多选。
<umi-treeview-x node-key="id" :data="files" :default-expanded-keys="expanded" :option="{ height: 500 }" />
type TreeNode = {
id?: string // node-key 默认使用此字段;自定义字段须全树唯一且稳定
label?: string // 默认显示字段;使用 props.label 时可省略
disabled?: boolean // 默认禁用字段
children?: TreeNode[]
}
Vue 和 UVue 均通过插件根目录导入类型:import type { TreeNode, TreeViewOption, TreeCheckState } from '@/uni_modules/umi-treeview-x'。根目录 index.ts / index.uts 提供公开类型入口,兼容付费加密插件,不要直接导入内部文件。更新树结构时替换根数组;传入的数据不会被组件原地修改。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| data | TreeNode[] | 必填 | 树节点数组;更新结构时替换根数组,组件不修改原始数据。节点 key 必须唯一、稳定且为非空字符串 |
| node-key | string | 'id' | 节点唯一标识的字段名;默认勾选、默认展开及按 key 操作的方法均使用该字段的值 |
| empty-text | string | '暂无数据' | 无数据或过滤结果为空时居中展示的文本,支持动态修改 |
| show-checkbox | boolean | false | 显示复选框;点击复选框勾选,点击行仅更新当前节点并展开或收起目录;隐藏时点击行为单选 |
| multiple | boolean | true | 仅在 show-checkbox 为 true 时生效;false 时最多勾选一个节点,隐藏复选框时始终单选 |
| check-strictly | boolean | false | 仅对复选框多选生效;false 时父子联动并显示半选,true 时独立勾选、不显示半选 |
| accordion | boolean | false | 同级只展开一个目录;初始展开、点击和展开方法均遵循此规则,同级冲突保留最后一项 |
| default-expanded-keys | string[] | [] | 初始展开节点的 key 数组;仅初始化读取,应同时列出需展开的祖先 key,后续通过展开方法管理 |
| default-checked-keys | string[] | [] | 初始勾选节点的 key 数组;仅初始化读取且只在 show-checkbox 为 true 时生效,遵循 multiple 和 check-strictly;后续通过 setCheckedKeys 等方法修改 |
| filter-node-method | FilterNodeMethod | 未设置 | 过滤回调 (value: string, data: TreeNode, node: ManagedTreeNode) => boolean;返回 true 保留节点,false 隐藏节点,但匹配节点的祖先仍保留。传入回调后调用 filter(value) 执行过滤,空字符串取消过滤 |
| props | TreeProps | 未设置(按默认字段解析) | 节点字段映射及回调配置,支持 label、children、disabled、class;字段说明见下表 |
| option | TreeViewOption | 未设置(使用各字段默认值) | 图标、间距、高亮、连线及虚拟滚动配置,字段说明见下表;支持部分传入及动态修改 |
<umi-treeview-x :data="files" empty-text="暂无目录" />
同时配置默认展开与默认勾选:
<umi-treeview-x
node-key="id"
:data="files"
show-checkbox
:multiple="true"
:check-strictly="false"
:default-expanded-keys="['workspace', 'design', 'development']"
:default-checked-keys="['prototype', 'frontend']"
:option="{ showIcon: true, highlight: false, height: 360 }"
/>
以上 key 应存在于 files 中;展开数组包含祖先路径。默认状态仅在初始化时读取,不触发交互事件。需要运行中修改时使用组件 ref 的展开或勾选方法。过滤属性的完整示例见「节点过滤」。
props 类型为 TreeProps(从 @/uni_modules/umi-treeview-x 导入),支持部分配置。替换配置对象或修改字段后重新解析节点;回调接收 (data: TreeNode, node: ManagedTreeNode),data 为原始节点。
| props 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| label | string / Function | 'label' | 显示字段名,或返回显示文本的回调;文本测宽和文件图标也使用解析后的标签 |
| children | string | 'children' | 子节点数组的字段名;更新子节点的方法同样使用该字段 |
| disabled | string / Function | 'disabled' | 布尔值字段名,或返回 boolean 的回调;禁用节点不可交互选择,父子勾选联动跳过禁用子树;仍可展开和触发节点点击 |
| class | string / Function | '' | 直接追加到节点行的类名,或返回类名的回调;字符串本身就是类名,不是字段名 |
<umi-treeview-x
:data="[{ id: 'root', name: '目录', items: [{ id: 'file', name: '文件', locked: true }] }]"
:props="{ label: 'name', children: 'items', disabled: 'locked', class: 'custom-tree-row' }"
show-checkbox
/>
自定义字段应在业务节点类型中声明;使用 class 定制内部行样式时,请在全局样式或允许穿透组件作用域的样式中定义对应类。叶节点由解析后的子节点数组自动判断。
option 支持部分传入,未设置的字段采用默认值;类型 TreeViewOption 从 @/uni_modules/umi-treeview-x 导入。
| option 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| width | number / string | '100%' | 树视口宽度;数字按 px 且最小为 0,字符串支持百分比和带单位的宽度 |
| height | number | 360 | 纵向滚动视口高度,单位 px,最小 24 |
| rowHeight | number | 38 | 固定行高,单位 px,最小 24 |
| indent | number | 50 | 每层缩进的物理像素数,最小 0;实际布局值除以设备 pixelRatio |
| virtual | boolean | true | 只渲染视口附近的节点;false 渲染全部可见节点 |
| overscan | number | 6 | 虚拟滚动时视口附近额外预渲染的行数,最小 0 |
| showExpander | boolean | true | 显示展开器;叶节点保留空白对齐,隐藏后仍可点击行展开 |
| expandedIcon | string | '' | 展开状态图片路径;空字符串使用内置向下箭头 |
| collapsedIcon | string | '' | 收起状态图片路径;空字符串使用内置向右箭头 |
| showIcon | boolean | false | 显示节点文字前的图标 |
| icon | string | '' | 统一的节点图标路径;空字符串按节点标签中的文件扩展名匹配内置图标,showIcon 为 true 时显示 |
| iconTextGap | number | 5 | 节点图标与文字的间距,逻辑像素,最小 0;showIcon 为 true 时生效 |
| expanderContentGap | number | 0 | 展开器与后方内容的间距,逻辑像素,最小 0;showExpander 为 true 时生效 |
| highlight | boolean | true | 显示选中节点背景和选中文字颜色;关闭不影响选择状态 |
| highlightColor | string | '#444444' | 选中背景颜色,highlight 为 true 时生效 |
| highlightTextColor | string | '#ffffff' | 选中文字颜色,highlight 为 true 时生效 |
| highlightWholeRow | boolean | true | true 高亮整行,false 仅在图标与文字区域显示圆角背景;highlight 为 true 时生效 |
| showLine | boolean | false | 显示父子层级连接线,根节点之间不连线;indent 为 0 时不绘制 |
| lineType | 'dashed' / 'solid' | 'dashed' | 连接线样式:虚线 / 实线;showLine 为 true 时生效 |
<umi-treeview-x node-key="id" :data="files" show-checkbox :multiple="true" :option="treeOption" />
可通过默认勾选值初始化,后续勾选由组件内部管理,通过 check 获取勾选结果:
<umi-treeview-x node-key="id" :data="files" show-checkbox :default-checked-keys="['design']" />
const treeOption = ref<TreeViewOption>({
width: '100%',
height: 500,
rowHeight: 38,
indent: 50,
virtual: true,
overscan: 6,
showExpander: true,
expandedIcon: '/static/tree/expanded.png',
collapsedIcon: '/static/tree/collapsed.png',
showIcon: true,
icon: '/static/tree/folder.png',
iconTextGap: 8,
expanderContentGap: 6,
highlight: true,
highlightColor: '#2563eb',
showLine: true,
lineType: 'dashed'
})
隐藏某类图标后同时移除其宽度及相邻间距。修改 option 可实时生效;修改顶层 multiple 从多选切回单选时保留首个选中 ID,并通过 check-change 通知勾选状态变化;getSelectedNode() 返回首个选中节点。
连线采用 1px 灰色细线,默认虚线。竖线沿父节点展开器中心轴向下延伸,横线连接各子节点:普通子节点形成「├」分支,最后一个子节点形成「└」直角,竖线到此结束;折叠后同步收起。隐藏展开器时参考文本前图标,无图标时位于缩进区域中部。连线随树一起横向滚动,虚拟滚动仅绘制渲染范围内的线段。indent 为 0 时不绘制连线。
首页 pages/index/index 以双列卡片展示九种示例,点击进入 pages/example/example?id=0..8 详情页。详情页默认展示运行效果,支持切换代码视图和复制完整用法;代码同步当前复选框模式、连线样式,切换视图保留树状态。
九种示例:
| 示例 | 配置与交互 |
|---|---|
| Filter 节点过滤 | 输入关键词调用 filter,隐藏不匹配节点,保留匹配节点的父级路径;支持清空与无结果提示 |
| Accordion 手风琴树 | accordion: true;同级只展开一个目录,支持初始展开和展开、收起按钮 |
| Directory 目录专用树 | 仅目录数据、文件夹图标、浅蓝圆角选中背景与展开 |
| Checkable Tree 复选框树 | show-checkbox: true、multiple: true、highlight: false;通过 check-strictly 选择独立勾选或父子联动,check 事件中的 checkedKeys 包含选中节点的 key |
| Compact Tree 紧凑型树 | rowHeight: 30、indent: 28、showIcon: false;减小行高、缩进和装饰 |
| showLine 带连接线树 | showLine: true;页面按钮切换 dashed / solid |
| Disabled Checkbox 禁用复选框 | 节点 disabled: true;禁用复选框不可点击,联动跳过禁用子树,禁用目录仍可展开 |
| Default Expanded & Checked 默认展开与选中 | 同时配置 default-expanded-keys 和 default-checked-keys;默认展开产品设计与研发文档,勾选交互原型与前端开发 |
| Node Selection 树节点的选择 | 提供 get by node、get by key、set by node、set by key、reset,演示勾选查询、设置及清空,结果展示在按钮下方 |
目录树、紧凑型树和带连接线树采用浅蓝圆角背景和蓝色选中文字,仅高亮图标与文字区域;复选框示例仅显示勾选状态,不高亮文字或背景;check-strictly 为 false 时支持父子联动与半选,为 true 时独立勾选。首页通过 change 事件更新选择提示;切换示例时重新初始化选中状态,并按 default-expanded-keys 恢复初始展开状态,均支持展开全部、收起全部。
事件参数中的 data 是传入树的原始节点对象,node 是对应的内部 ManagedTreeNode(包含 key、node 原始数据、parent、children、depth、expanded、selected 等状态),component 是当前树组件实例。行由树组件直接渲染,没有独立的行组件实例。
| 事件名 | 触发时机 | 参数(按顺序) |
|---|---|---|
| node-click | 点击节点行 | data、node、component、event 原始事件对象 |
| check-change | 节点勾选或半选状态变化,包括联动影响的后代、祖先以及 multiple/check-strictly 配置变化 | data、checked 是否勾选、indeterminate 是否半选 |
| check | 点击节点复选框后,状态更新完成时触发一次 | data、{ checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys } |
| current-change | 当前节点行变化;重复点击同一行不重复触发 | 当前节点 data、node;清空时均为 null |
| node-expand | 目录节点展开,包含组件展开方法引起的变化 | data、node、component |
| node-collapse | 目录节点收起,包含手风琴模式自动收起及组件收起方法 | data、node、component |
| change | 兼容事件,点击选择或复选框后 | 选中 key 数组、data |
| expand | 兼容事件,节点展开或收起后 | data、expanded 是否展开 |
| node-long-click | 兼容事件,长按节点 | data |
| data-error | 数据含重复 key、缺失 key 或循环引用,清空视图 | error |
初始默认勾选和默认展开不触发交互事件。勾选状态快照包含全部节点(包括折叠后代),半选节点不计入 checkedNodes/checkedKeys;check-strictly 为 true 或 multiple 为 false 时半选数组为空。check 只由复选框点击触发,配置变化可触发 check-change,不触发 check。复选框点击不触发 node-click 或 current-change;点击行更新当前节点,不改变复选框状态。
<umi-treeview-x
node-key="id"
:data="files"
show-checkbox
@node-click="onNodeClick"
@check-change="onCheckChange"
@check="onCheck"
@current-change="onCurrentChange"
@node-expand="onNodeExpand"
@node-collapse="onNodeCollapse"
/>
import type { TreeNode, TreeCheckState } from '@/uni_modules/umi-treeview-x'
function onCheck(data: TreeNode, state: TreeCheckState) {
console.log(data, state.checkedKeys, state.halfCheckedKeys)
}
组件 ref 提供 expandAll()、collapseAll()、expandNode(id)、collapseNode(id)、expandNodeBranch(id)、collapseNodeBranch(id)、expandNodesAtLevel(level) 和 getSelectedNode()。层级从 0 开始。
内部 ManagedTreeNode 对应上游 TreeNode,保存值、父子引用、层级及状态;TreeNodeManager 保存可见列表,通过插入/移除后代完成展开折叠;TreeViewAdapter 管理单选和公开操作。显式栈替代递归,以支持深层树。父子图留在响应式系统外,通过版本信号更新渲染列表。
首页采用浅灰背景、白色目录卡片和蓝色示例切换按钮,展示九种树示例入口,提供展开/收起操作及当前选择提示。顶部避让系统状态栏。横向滚动保留深层及长目录名的访问能力,文本宽度采用跨端估算值。
验证:npm run verify 检查类型、双入口、事件参数与勾选状态快照、当前节点变化、可见列表顺序、选择切换、分支操作、图标映射和一万层树;npm run build:web 使用本机 HBuilderX 构建;npm run verify:web 用 Playwright/Edge 检查首页九种示例、勾选与展开独立性、状态保留、紧凑行高、连线切换和运行时错误。默认 HBuilderX 路径 D:/office/HBuilderX,可用 HBUILDERX_HOME 覆盖。截图输出 unpackage/dist/treeview-directory.png、treeview-checkable.png、treeview-compact.png 和 treeview-lines.png。
scripts/convert-amr-icons.cjs 可从 unpackage/amr-source 中的官方 VectorDrawable XML 重新生成图标。构建使用 Vite 内置 esbuild 压缩,无需额外安装 terser。
本机已验证 Web。Android / iOS / HarmonyOS 原生编译、SVG 支持和系统动效尚待验证。源码及图标的上游版权声明见 LICENSE-AmrDeveloper.txt。
节点过滤
通过 filter-node-method 传入 (value: string, data: TreeNode, node: ManagedTreeNode) => boolean,调用组件 filter(value: string) 执行过滤。返回 false 的节点隐藏,但匹配节点的祖先保留,以展示完整路径;过滤时自动展示所有匹配路径,不修改原始展开与勾选状态。清空字符串取消过滤、恢复原展开状态;更新数据后沿用当前条件。非空过滤值必须配置回调。
<umi-treeview-x ref="tree" :data="directories" :filter-node-method="filterNode" />
function filterNode(value: string, data: TreeNode): boolean {
return (data.label ?? '').indexOf(value) >= 0
}
// Vue: tree.value?.filter('设计')
// UVue: tree.value?.$callMethod('filter', '设计')
// 取消过滤:filter('')
对外方法
Vue 通过组件 ref 直接调用,UVue 通过 tree.value?.$callMethod('方法名', ...参数) 调用。key 使用 node-key 字段的字符串值;data 使用原始节点对象(也支持包含同一 key 的对象)。
| 方法 | 参数 | 返回值与行为 |
|---|---|---|
| filter | value: string | 按 filter-node-method 过滤;空字符串恢复原展开状态 |
| updateKeyChildren | key: string, data: TreeNode[] | 替换指定节点的子节点,遵循 props.children 映射;保留有效展开和勾选状态,原始数据不被修改 |
| getCheckedNodes | leafOnly = false, includeHalfChecked = false | 返回勾选节点的原始数据数组;leafOnly 仅保留叶子节点,includeHalfChecked 包含半选节点 |
| setCheckedNodes | nodes: TreeNode[], leafOnly = false | 替换勾选状态,按 node-key 匹配;leafOnly 仅保留叶子节点的勾选状态 |
| getCheckedKeys | leafOnly = false | 返回勾选节点的 key 数组;leafOnly 仅返回叶子节点 |
| setCheckedKeys | keys: string[], leafOnly = false | 替换勾选状态;空数组清空,未知 key 忽略;leafOnly 仅保留叶子节点的勾选状态 |
| setChecked | key/data: string / TreeNode, checked: boolean, deep = false | 设置指定节点勾选状态;deep 递归更新后代,即使 check-strictly 为 true 也生效;跳过禁用子树 |
| setCurrentKey | key: string / null, shouldAutoExpandParent = true | 设置当前节点,默认展开祖先;null 清空当前节点;无复选框时同步单选高亮 |
| setCurrentNode | node: TreeNode, shouldAutoExpandParent = true | 按节点数据设置当前节点,默认展开祖先 |
| getNode | key/data: string / TreeNode | 返回内部 ManagedTreeNode,包含 key、node、parent、children、depth 等字段;未找到返回 null |
勾选查询和设置方法仅在 show-checkbox 为 true 时生效。设置勾选遵循 multiple;setCheckedKeys / setCheckedNodes 默认遵循 check-strictly。程序设置勾选触发实际变化节点的 check-change,不触发仅用于用户点击的 check。设置当前节点触发 current-change,自动展开触发 node-expand;不触发 node-click。方法按各自用途返回结果,设置方法不返回节点数组。
// Vue
tree.value?.setCheckedKeys(['prototype', 'frontend'])
const checked = tree.value?.getCheckedNodes(false, true)
tree.value?.setCurrentKey('frontend')
// UVue
tree.value?.$callMethod('setCheckedKeys', ['prototype', 'frontend'])
tree.value?.$callMethod('setCurrentKey', 'frontend', true)
tree.value?.$callMethod('updateKeyChildren', 'design', [{ id: 'new', label: '新目录' }])

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 1495
赞赏 4
下载 12688653
赞赏 1956
赞赏
京公网安备:11010802035340号