vue 实现目录树
Vue 实现目录树的方法
在 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-tree-list 或 element-ui 的 el-tree 组件。
<template>
<el-tree
:data="treeData"
:props="defaultProps"
@node-click="handleNodeClick">
</el-tree>
</template>
<script>
export default {
data() {
return {
treeData: [{
label: '一级 1',
children: [{
label: '二级 1-1',
children: [{
label: '三级 1-1-1'
}]
}]
}],
defaultProps: {
children: 'children',
label: 'label'
}
};
},
methods: {
handleNodeClick(data) {
console.log(data);
}
}
};
</script>
动态加载数据
对于大型目录树,可以使用动态加载数据的方式优化性能。
<template>
<el-tree
:props="props"
:load="loadNode"
lazy>
</el-tree>
</template>
<script>
export default {
data() {
return {
props: {
label: 'name',
children: 'zones',
isLeaf: 'leaf'
}
};
},
methods: {
loadNode(node, resolve) {
if (node.level === 0) {
return resolve([{ name: 'region' }]);
}
if (node.level > 1) return resolve([]);
setTimeout(() => {
const data = [{
name: 'leaf',
leaf: true
}, {
name: 'zone'
}];
resolve(data);
}, 500);
}
}
};
</script>
自定义样式和交互
可以根据需求自定义目录树的样式和交互行为。
<template>
<div class="custom-tree-container">
<div class="block">
<el-tree
:data="data"
node-key="id"
default-expand-all
:expand-on-click-node="false">
<span class="custom-tree-node" slot-scope="{ node, data }">
<span>{{ node.label }}</span>
<span>
<el-button
type="text"
size="mini"
@click="() => append(data)">
Append
</el-button>
<el-button
type="text"
size="mini"
@click="() => remove(node, data)">
Delete
</el-button>
</span>
</span>
</el-tree>
</div>
</div>
</template>
<script>
let id = 1000;
export default {
data() {
return {
data: [{
id: 1,
label: '一级 1',
children: [{
id: 4,
label: '二级 1-1',
children: [{
id: 9,
label: '三级 1-1-1'
}, {
id: 10,
label: '三级 1-1-2'
}]
}]
}]
}
},
methods: {
append(data) {
const newChild = { id: id++, label: 'testtest', children: [] };
if (!data.children) {
this.$set(data, 'children', []);
}
data.children.push(newChild);
},
remove(node, data) {
const parent = node.parent;
const children = parent.data.children || parent.data;
const index = children.findIndex(d => d.id === data.id);
children.splice(index, 1);
}
}
};
</script>
使用 Vue 3 Composition API
在 Vue 3 中,可以使用 Composition API 来实现目录树功能。
<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>
import { defineComponent } from 'vue';
export default defineComponent({
name: 'TreeNode',
props: {
treeData: {
type: Array,
required: true
}
}
});
</script>
以上方法可以根据具体需求选择适合的实现方式。递归组件适合简单的树形结构,第三方库如 element-ui 提供了更多高级功能,动态加载适合大数据量的场景,自定义样式和交互可以满足特定的设计需求。







