Vue组件代码实现
<template>
<div>
<!-- 组件内容 -->
</div>
</template>
<script>
export default {
data() {
return {
menuData: [
{
title: '一级菜单1',
visible: true,
children: [
{
title: '二级菜单1',
visible: true,
children: []
},
{
title: '二级菜单2',
visible: true,
children: [
{
title: '三级菜单1',
visible: true,
children: []
}
]
}
]
}
]
};
},
computed: {
visibleMenuPaths() {
const paths = [];
const stack = [];
const traverse = (menuItem) => {
stack.push(menuItem.title);
if (menuItem.visible) {
paths.push([...stack]);
}
if (menuItem.children && menuItem.children.length > 0) {
menuItem.children.forEach(child => traverse(child));
}
stack.pop();
};
this.menuData.forEach(item => traverse(item));
return paths;
}
}
};
</script>
<style scoped>
/* 样式 */
</style>
计算属性的缓存和性能优化
- 利用Vue的计算属性缓存机制:Vue自动为计算属性实现了缓存功能。只要依赖的数据(这里是
menuData
)没有发生变化,再次访问visibleMenuPaths
计算属性时,不会重新执行计算函数,而是直接返回缓存的结果。
- 减少不必要的计算:在
traverse
函数中,我们采用深度优先遍历(DFS)的方式,只对可见节点进行路径记录,避免对不可见节点进行无效的路径计算。
- 防抖和节流:如果
menuData
的更新频率较高,可以考虑使用防抖或节流技术。例如,如果数据是通过用户操作动态更新的,可以在数据更新的方法上应用防抖,确保在一定时间间隔内只执行一次更新,减少计算属性不必要的重新计算。
- 拆分计算属性:如果
menuData
非常复杂且包含多个不同维度的计算需求,可以考虑拆分计算属性。比如将获取可见节点的操作和其他与菜单相关的计算分开,这样当某一部分数据变化时,不会影响其他计算属性的缓存。