当前位置: 首页 > news >正文

Vue2 全局事件总线:通俗易懂 + 简单案例

全局事件总线就像一个 “全校通知群”—— 不管是一年级(子组件)、二年级(父组件)还是教务处(隔代组件),只要进了这个群,就能给群里任何人发消息(传数据),不用管彼此是什么关系。

一、先搞懂核心:为啥需要它?

比如有两个毫无关系的组件:学生组件(想发 “我叫小明”)和老师组件(想收这个名字)。它们不是父子,没法用之前的 “子传父” 自定义事件,这时候就需要 “全局事件总线” 这个 “群” 来搭桥。

二、三步用起来(带完整案例)

我们用「学生组件(发数据)+ 老师组件(收数据)」举例,需求:学生点按钮,把自己的名字传给老师。

第一步:建 “通知群”(安装全局事件总线)

首先要在项目入口(main.js)里建这个 “群”,让所有组件都能进群。原理:给 Vue 的 “公共原型” 上挂一个 “群聊账号”(叫$bus),所有组件都能通过this.$bus找到它。

main.js 代码

import Vue from 'vue'
import App from './App.vue'Vue.config.productionTip = false// 建“通知群”:给所有组件挂一个共用的Vue实例($bus)
new Vue({el: '#app',render: h => h(App),// beforeCreate钩子:组件还没初始化数据,先把“群”建好beforeCreate() {Vue.prototype.$bus = this  // this就是当前Vue实例,作为“群聊账号”}
})

第二步:老师进群等消息(接收方绑定事件)

老师组件(收数据的)要先在 “群” 里说:“谁发学生名字,我接收!”—— 这就是用$bus.$on绑定事件。

Teacher.vue(老师组件)代码

<template><div class="teacher"><h3>我是老师组件</h3><p>收到的学生名:{{ studentName }}</p> <!-- 显示收到的名字 --></div>
</template><script>
export default {name: 'Teacher',data() {return {studentName: ''  // 存学生传过来的名字}},// 组件挂载后,进群等消息(确保“群”已建好)mounted() {// $bus.$on("事件名", 收到消息要做的事)this.$bus.$on('send-student-name', (name) => {// name就是学生传过来的名字this.studentName = name  // 把名字存起来,页面就显示了})},// !重要:老师退群前,取消“等消息”(防止占内存)beforeDestroy() {this.$bus.$off('send-student-name')  // 解绑事件,不再接收}
}
</script>

第三步:学生发消息到群里(发送方触发事件)

学生组件(发数据的)点按钮时,在 “群” 里喊:“我叫小明!”—— 这就是用$bus.$emit触发事件。

Student.vue(学生组件)代码

<template><div class="student"><h3>我是学生组件</h3><!-- 点按钮,发消息到“群”里 --><button @click="sendMyName">把名字发给老师</button></div>
</template><script>
export default {name: 'Student',data() {return {myName: '小明'  // 要传给老师的名字}},methods: {sendMyName() {// $bus.$emit("事件名", 要传的数据) —— 事件名要和老师绑的一致!this.$bus.$emit('send-student-name', this.myName)}}
}
</script>

第四步:父组件组装(App.vue)

最后把两个组件放在父组件里,让它们能找到 “群”:

App.vue 代码

<template><div class="app"><h2>全局事件总线演示</h2><Student /> <!-- 学生组件 --><Teacher /> <!-- 老师组件 --></div>
</template><script>
import Student from './components/Student.vue'
import Teacher from './components/Teacher.vue'export default {components: { Student, Teacher }
}
</script>

三、注意

  1. 事件名要一致:学生发的send-student-name,和老师绑的必须一样,不然收不到;
  2. 必须解绑:老师组件销毁前(beforeDestroy)一定要用$off解绑,不然会占内存;
  3. 谁收谁绑:接收数据的组件(老师)绑事件,发送数据的组件(学生)触发事件。
http://www.dtcms.com/a/403305.html

相关文章:

  • Flask模板中使用Vue、ant-design-vue、@ant-design/icons-vue示例模板
  • 石狮建设局网站保定网站建设系统
  • vLLM PD分离推理服务配置指南
  • C++ 学习与 CLion 使用:(十五)多文件编程,和C语言一样的多文件编程
  • BEAT币
  • 淘宝的网站怎么做公司网站如何被收录
  • Ansible实现自动化运维
  • Zabbix7.4.8(三):通过Zabbix agent 2监控Docker相关指标
  • 小型个人网站制作网页打不开的原因及解决方法
  • Ansible 入门到实战:自动化运维的瑞士军刀
  • 嵌入式学习---(linux驱动)
  • k8s集群与gitlab registry连接
  • MySQL笔记---对表的操作
  • 【实战避坑】MySQL修改表字段长度完整指南:从语法、锁表机制到在线DDL详解
  • 乐峰网网站是谁做的海门住房和城乡建设局网站
  • 做公司简介的开源网站做网站推广前途
  • 了解学习Nginx反向代理与缓存功能
  • 【黑马程序员】后端Web基础--Maven基础和基础知识
  • Linux系统Nginx服务(三)
  • 新手向 算法 基数排序-yang
  • 怎么搭建php网站网页设计个人网站设计
  • 小淇云库-Python 虚拟环境选择:venv、conda、poetry 的适用场景对比
  • 芋道源码 - RabbitMQ + WebSocket 实现分布式消息推送
  • Spring Data JPA 语法详解与使用案例
  • 网站开发面试题天津公司建设网站
  • 个人怎么做音乐网站网页设计与制作教程刘瑞新课后答案
  • noi-9月23日作业
  • 购物网站每个模块主要功能怎么免费搭建网站
  • 如何高效使用Xshell和finalshell连接服务器,简单高效
  • Nestjs框架: 策略的权限控制(ACL)与数据权限实战