uniapp树形选择
uniapp树形选择实现方法
使用uni-data-checkbox组件
uni-app提供了uni-data-checkbox组件支持树形选择功能。该组件需要配合特定的数据结构使用,通常为嵌套的children格式。
示例数据结构:
[
{
"text": "父节点1",
"value": "1",
"children": [
{
"text": "子节点1-1",
"value": "1-1"
}
]
}
]
模板代码示例:
<uni-data-checkbox
v-model="value"
:localdata="treeData"
multiple
mode="tag"
></uni-data-checkbox>
自定义树形组件
对于更复杂的需求,可以基于uni-list和递归组件实现自定义树形选择器。
核心实现步骤:
-
创建递归组件
tree-node<template> <view> <view @click="toggle"> {{node.label}} </view> <view v-if="expanded" v-for="child in node.children"> <tree-node :node="child"></tree-node> </view> </view> </template> -
主组件中引入并使用
<tree-node v-for="item in treeData" :node="item" :key="item.value" ></tree-node>
第三方组件库方案
可以使用uView UI等第三方组件库中的树形选择组件,通常提供更丰富的功能。
uView示例:
<u-tree
:list="treeList"
@click="handleClick"
></u-tree>
注意事项
- 大数据量时需考虑虚拟滚动优化性能
- 移动端注意触摸事件处理
- 多选情况下需要自己维护选中状态
- 数据扁平化处理可能提升渲染性能
树形数据结构处理
处理树形数据时常用方法:
递归查找节点:
function findNode(tree, value) {
for (const node of tree) {
if (node.value === value) return node
if (node.children) {
const found = findNode(node.children, value)
if (found) return found
}
}
return null
}
扁平化处理:
function flattenTree(tree) {
return tree.reduce((acc, node) => {
acc.push(node)
if (node.children) {
acc.push(...flattenTree(node.children))
}
return acc
}, [])
}






