VUE树形菜单组件如何实现展开/收起、全选/取消功能

组件结构

基于Vue 3和Element Plus的树形菜单组件,包含展开/收起、全选/取消功能。模板部分使用el-tree展示层级数据,底部按钮控制展开状态和选择状态。

核心功能实现

数据转换 通过buildTree函数将扁平数组转换为树形结构:

typescript 复制代码
const buildTree = (list: MenuNode[], pid = 0) => 
    list.filter(i => i.pid === pid).map(i => ({ ...i, children: buildTree(list, i.id) }));

展开控制 利用expandedKeys和节点遍历实现展开状态切换:

typescript 复制代码
const toggleExpand = () => {
    isExpanded.value = !isExpanded.value;
    menuTreeRef.value?.store._getAllNodes().forEach(n => n.expanded = isExpanded.value);
};

全选逻辑 递归收集所有节点ID实现全选功能:

typescript 复制代码
const getAllMenuIds = () => {
    const ids: number[] = [];
    const collect = (n: MenuNode) => { ids.push(n.id); n.children?.forEach(collect); };
    menuData.value.forEach(collect);
    return ids;
};

动态数据加载 支持API异步加载数据时可添加lazy属性和load方法:

typescript 复制代码
<el-tree :load="loadNode" lazy />

自定义节点内容 通过插槽实现节点定制化渲染:

html 复制代码
<el-tree>
    <template #default="{ data }">
        <span class="custom-node">{{ data.title }}</span>
    </template>
</el-tree>

性能优化 大数据量时建议启用虚拟滚动:

typescript 复制代码
<el-tree :height="400" virtual-scrolling />

典型应用场景

  1. 权限管理系统:勾选菜单项作为角色权限配置
  2. 目录导航:展示多级分类结构
  3. 数据筛选:树形条件选择器

注意事项

  1. 节点ID需保持唯一性
  2. 深层嵌套数据建议限制层级深度
  3. 选中状态持久化需配合localStorage或后端存储

效果如下:

收起

展开

全选

代码如下:

相关推荐
前端不太难1 小时前
从 Navigation State 反推架构腐化
前端·架构·react
前端程序猿之路2 小时前
Next.js 入门指南 - 从 Vue 角度的理解
前端·vue.js·语言模型·ai编程·入门·next.js·deepseek
大布布将军2 小时前
⚡️ 深入数据之海:SQL 基础与 ORM 的应用
前端·数据库·经验分享·sql·程序人生·面试·改行学it
川贝枇杷膏cbppg2 小时前
Redis 的 RDB 持久化
前端·redis·bootstrap
D_C_tyu3 小时前
Vue3 + Element Plus | el-table 表格获取排序后的数据
javascript·vue.js·elementui
JIngJaneIL3 小时前
基于java+ vue农产投入线上管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
天外天-亮3 小时前
v-if、v-show、display: none、visibility: hidden区别
前端·javascript·html
jump_jump3 小时前
手写一个 Askama 模板压缩工具
前端·性能优化·rust
hellotutu3 小时前
vue2 从 sessionStorage 手动取 token 后,手动加入到 header
vue.js·token·session·header
be or not to be3 小时前
HTML入门系列:从图片到表单,再到音视频的完整实践
前端·html·音视频