Vue 组件通信怎么实现树形菜单节点点击时通过 Emit 向上层抛出路径

冰川箭仙

冰川箭仙

2026-08-01

240人浏览

原创

Vue-router参考手册
Vue-router参考手册

Vue-router参考手册下载

下载
树形菜单节点点击时需主动组装完整路径并$emit:子组件通过node.parentnode向上遍历获取路径数组,预置path字段更高效;element plus的node-click回调中调用getpatharray(node)构造路径,再this.$emit('node-path', path, data)传递给父组件。

vue 组件通信怎么实现树形菜单节点点击时通过 emit 向上层抛出路径

树形菜单节点点击时通过 $emit 向上层抛出完整路径,核心在于:子组件捕获点击事件后,**主动向上逐级组装路径数组(或路径字符串)**,再通过 this.$emit 发送给父组件。Vue 的 $emit 本身不冒泡,所以不能依赖“自动冒泡”,必须显式构造路径并传递。

明确路径定义与组装逻辑

所谓“路径”,通常指从根节点到当前点击节点的层级标识序列,例如:
['产品管理', '分类设置', '手机配件']['001', '001-002', '001-002-005']
关键不是递归遍历,而是每个节点在渲染时就**知道自己在树中的位置和祖先信息**。

  • 推荐在原始树数据中为每个节点预置 path 字段(后端生成或前端初始化时计算),避免运行时反复遍历
  • 若数据无预置 path,可在子组件 node-click 回调中,通过 node 实例的 parent 属性向上遍历(Element Plus 的 Node 对象支持 parentNodedata
  • 注意:Element Plus 的 el-treenode-click 第二个参数 nodeNode 类实例,含 parentNodeleveldata 等属性,可直接用于路径回溯

子组件中正确触发 emit 并携带路径

以 Element Plus el-tree 为例,子组件模板与脚本需配合:

  • 模板中绑定 @node-click="handleNodeClick"
  • 方法内获取点击节点的 node,调用 getPathArray(node) 得到路径数组(如 ['一级', '二级', '当前项']
  • 执行 this.$emit('node-path', pathArray, node.data),确保父组件能同时拿到结构化路径和原始节点数据

示例代码片段(子组件):

methods: {<br>  handleNodeClick(data, node) {<br>    const path = this.getPathArray(node);<br>    this.$emit('node-path', path, data);<br>  }<br>  getPathArray(node) {<br>    const path = [];<br>    let current = node;<br>    while (current) {<br>      path.unshift(current.data.label || current.data.name);<br>      current = current.parentNode;<br>    }<br>    return path;<br>  }<br>}

父组件监听并使用路径数据

父组件只需用 @node-path 接收事件,并在对应方法中解构参数即可:

  • 监听写法:<categorytree></categorytree>
  • 处理方法接收两个参数:第一个是路径数组,第二个是当前节点原始数据对象
  • 可直接用于更新面包屑、筛选表格、请求接口(如 GET /api/items?categoryPath=...

示例(父组件):

methods: {<br>  onNodePath(path, nodeData) {<br>    console.log('完整路径:', path); // ['系统设置', '权限管理', '角色列表']<br>    console.log('当前节点:', nodeData);<br>    this.breadcrumbItems = path;<br>    this.loadTableData(nodeData.id);<br>  }<br>}

进阶建议:统一事件名与类型声明(Vue 3 + TS)

若使用 Vue 3 组合式 API 和 TypeScript,应在子组件中显式声明 emits:

  • 添加 emits: ['node-path'](选项式)或 defineEmits(['node-path'])(组合式)
  • 为事件载荷定义接口,提升类型安全,例如:
    interface NodePathPayload { path: string[]; node: TreeNode; }
    然后 this.$emit('node-path', payload)
  • 避免使用模糊事件名如 clickselect,统一用语义化名称如 node-pathtree-node-select

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

2284

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

2154

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

2344

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

336

5

vue2.0和3.0区别
vue2.0和3.0区别

vue2.0和3.0区别:vue2的响应式原理是利⽤“Object.defineProperty()”对数据进⾏劫持结合发布订阅模式的⽅式来实现,vue3中使⽤了es6的proxy API对数据代理,实现对数据的监控。本专题为大家提供vue2.0和3.0区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.17

915

5

vue3的生命周期有哪些
vue3的生命周期有哪些

vue3的生命周期:1、beforecreate;2、created;3、beforemount;4、mounted;5、beforeupdate;6、updated;7、beforedestroy;8、destroyed;9、activated;10、deactivated等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

10619

5

Vue3组合式API与组件开发实战
Vue3组合式API与组件开发实战

本专题讲解 Vue 3 组合式 API 的核心概念与应用技巧,深入分析响应式系统、生命周期管理、组件设计与复用策略。通过完整项目案例,指导前端开发者实现高性能、结构清晰的 Vue 应用,提升开发效率与代码可维护性。

2026.02.10

153

23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 15.5万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.2万人学习