更新记录

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: '新目录' }])

隐私、权限声明

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

无

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

插件不采集任何数据

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

无

暂无用户评论。