vue实现树状结构
Vue 实现树状结构的方法
递归组件实现
通过递归组件可以轻松实现树状结构。定义一个组件,该组件在其模板中调用自身,适用于嵌套数据。
<template>
<ul>
<li v-for="item in treeData" :key="item.id">
{{ item.name }}
<tree-node v-if="item.children" :treeData="item.children"></tree-node>
</li>
</ul>
</template>
<script>
export default {
name: 'TreeNode',
props: {
treeData: {
type: Array,
required: true
}
}
}
</script>
使用第三方库
Vue生态中有许多成熟的树形组件库,如vue-tree-halation或element-ui的el-tree,可直接使用。
<template>
<el-tree :data="treeData" :props="defaultProps"></el-tree>
</template>
<script>
export default {
data() {
return {
treeData: [{
label: '一级节点',
children: [{
label: '二级节点'
}]
}],
defaultProps: {
children: 'children',
label: 'label'
}
}
}
}
</script>
动态加载数据
对于大数据量的树状结构,可以采用动态加载方式,当展开节点时再加载子节点数据。
<template>
<ul>
<li v-for="item in treeData" :key="item.id" @click="loadChildren(item)">
{{ item.name }}
<span v-if="item.isLoading">Loading...</span>
<tree-node v-if="item.children" :treeData="item.children"></tree-node>
</li>
</ul>
</template>
<script>
export default {
methods: {
loadChildren(item) {
if (!item.children) {
item.isLoading = true
fetchChildren(item.id).then(children => {
item.children = children
item.isLoading = false
})
}
}
}
}
</script>
自定义样式和交互
通过CSS和事件处理实现自定义的树状结构样式和交互效果。
<template>
<div class="tree">
<div
v-for="item in treeData"
:key="item.id"
class="tree-node"
@click="toggleExpand(item)"
>
<div class="tree-node-content">
<span class="tree-node-icon">{{ item.expanded ? '-' : '+' }}</span>
{{ item.name }}
</div>
<div v-show="item.expanded" class="tree-children">
<tree-node :treeData="item.children"></tree-node>
</div>
</div>
</div>
</template>
<style>
.tree-node {
margin-left: 20px;
}
.tree-node-icon {
margin-right: 5px;
cursor: pointer;
}
</style>
使用Vue的provide/inject
对于深层嵌套的树状结构,可以使用provide/inject来避免逐层传递props。

<script>
// 父组件
export default {
provide() {
return {
treeRoot: this
}
}
}
// 子组件
export default {
inject: ['treeRoot']
}
</script>
这些方法可以根据具体需求选择或组合使用,实现功能丰富、性能优良的树状结构组件。





