Vue23全局事件总线

Vue2&3全局事件总线

Vue2全局事件总线

在这里插入图片描述

  • 功能:可以解决所有组件之间通信传数据的问题
  • 原理:通过一个共享对象,将所有组件全部绑定到对象上,即可通过这个对象实现组件与组件之间的传递数据,而这个共享对象叫做全局事件总线。

如何分清楚谁是发送方,谁是接收方?谁用绑定事件,谁用触发事件?

  • 假设:我向你传送数据,我是发送方,你是接收方。
    • 若我不向你发送数据,则你就不知道数据的内容,无法拿取(绑定)。(我不触发,你不能绑定,因为你没有数据)
    • 只有我发送数据给你,你才能知道数据的内容,才能对数据进行拿取。(谁发送谁触发,谁拿取谁绑定)

共享对象创建位置:main.js文件

  • 第一种方法:创建vc对象
// 获取 VueComponent 构造函数
const VueComponentConstructor = Vue.extend({})
// 创建 vc 对象
const vc = new VueComponentConstructor()
// 使所有组件共享 vc 对象
Vue.prototype.$bus = vc
  • 第二种方法(常用):使用原有的vm对象
    • 在Vue初始化时(beforeCreate),创建共享对象vm
new Vue({
  el : '#app',
  render: h => h(App),
  beforeCreate(){
    // this指向的是vm
    Vue.prototype.$bus = this
  }
})

以上代码中出现的$bus有什么作用?

  • $bus:事件总线,用来管理总线。
  • 其他组件在调用vc共享对象时可通过this.$bus.$on()this.$bus.$emit()来绑定或触发事件

数据发送方:触发事件$emit

  • 触发事件:this.$bus.$emit('事件名', 接受的数据)
// Vip.vue
<template>
    <div>
        <button @click="triggerEvent">触发事件</button>
    </div>
</template>

<script>
    export default {
        name : 'Vip',
        data(){
            return{
                name : 'zhangsan'
            }
        },
        methods : {
            triggerEvent(){
                this.$bus.$emit('event', this.name)
            }
        }
    }
</script>

数据接收方:绑定事件$on

  • 绑定事件:this.$bus.$on('事件名', 回调函数)
// App.vue
<template>
    <div>
        <Vip></Vip>
    </div>
</template>

<script>
    import Vip from './components/Vip.vue'
    export default {
        name : 'App',
        mounted() {
            this.$bus.$on('event', this.test)
        },
        methods : {
            test(name){
                console.log(name);
            }
        },
        components : {Vip}
    }
</script>

Vue3全局事件总线

安装mitt

  • 在CMD窗口中,跳转到Vue3安装路径下
  • 输入命令npm i mitt,当出现up to date in 595ms等类似信息表示安装成功

使用mitt(只要使用全局事件总线,所在的组件就要引入emitter)

  • 第一步:创建一个文件夹utils,在文件夹中创建js文件(event-bus.js)
  • 第二步:在js文件中导入并暴露mitt(如下)
    • 这里的操作主要是为了生成对象emitter
// utils/event-bus.js
import mitt from 'mitt'

// mitt函数的执行会生成一个对象:emitter对象
// emitter对象是一个全局事件总线对象
// 绑定和触发的操作都在这个对象上的完成
export default mitt()

实现绑定与触发事件

  • 绑定事件:emitter.on('事件名', 回调函数)
  • 触发事件:emitter.emit('事件名', 接收的数据)
// App.vue
<template>
    <Info></Info>
</template>

<script>
    // 引入全局事件总线对象
    import emitter from './utils/event-bus.js'
    import Info from './components/Info.vue'
    // 引入组合式API:生命周期钩子
    import { onMounted } from 'vue'
    export default {
        name : 'App',
        components : {Info},
        setup(){
            // 生命周期钩子:onMounted
            onMounted(() => {
                // 绑定事件
                emitter.on('event1', showInfo)
            })
            
            function showInfo(info){
                alert(`姓名:${info.name}`)
            }

            return {showInfo}
        }
    }
</script>
// Info.vue
<template>
    <button @click="triggerEvent1">触发event1事件</button>
</template>

<script>
    // 导入全局事件总线对象
    import emitter from '../utils/event-bus.js'
    export default {
        name : 'Info',
        setup(){
            function triggerEvent1(){
                // 触发事件
                emitter.emit('event1', {name:'jack'})
            }
            
            return {triggerEvent1}
        }
    }
</script>

解绑事件

  • 原理:在子组件中使用 off 可以消除指定的事件
  • 解绑事件:emitter.off('事件名')
// Info.vue
<template>
    <button @click="triggerEvent1">触发event1事件</button>
    <br>
    <button @click="clearEvent1">解绑event1事件</button>
</template>

<script>
    // 引入入全局事件总线对象
    import emitter from '../utils/event-bus.js'
    export default {
        name : 'Info',
        setup(){
            function triggerEvent1(){
                // 触发全局事件总线上的事件
                emitter.emit('event1', {name:'jack'})
            }

            function clearEvent1(){
                // 解绑指定的事件
                emitter.off('event1')
            }
            
            return {triggerEvent1, clearEvent1}
        }
    }
</script>

Vue2和Vue3在触发和绑定上的不同

  • 第一点:引用的方式不同
// Vue2 的 main.js
new Vue({
  el : '#app',
  render: h => h(App),
  beforeCreate(){
    Vue.prototype.$bus = this
  }
})

// Vue3 的 utils/event-bus.js
import mitt from 'mitt'
export default mitt()
  • 第二点:调用方式的不同
// Vue2
绑定:this.$bus.$on('事件名', 回调函数)
触发:this.$bus.$emit('事件名', 接受的数据)
解绑:this.$bus.$off('事件名')

// Vue3 需要先引入 import emitter from '../utils/event-bus.js'
绑定:emitter.on('事件名', 回调函数)
触发:emitter.emit('事件名', 接收的数据)
解绑:emitter.off('事件名')
JavaScript
// Vue2
绑定:this.$bus.$on('事件名', 回调函数)
触发:this.$bus.$emit('事件名', 接受的数据)
解绑:this.$bus.$off('事件名')

// Vue3 需要先引入 import emitter from '../utils/event-bus.js'
绑定:emitter.on('事件名', 回调函数)
触发:emitter.emit('事件名', 接收的数据)
解绑:emitter.off('事件名')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/155763.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…

【JUC】八、阻塞队列

文章目录 1、阻塞队列概述2、阻塞队列分类3、 阻塞队列的四组核心方法4、Demo 队列&#xff0c;先进先出&#xff0c;类似排队栈&#xff0c;先进后出&#xff0c;用于要优先处理最近发生的事件的场景 1、阻塞队列概述 阻塞队列&#xff0c;一个生产消费模式&#xff0c;当&a…

数组相关面试题--5.合并两个有序数组

5. 合并两个有序数组 88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; 解题思路:1. 从后往前遍历数组&#xff0c;将nums1和nums2中的元素逐个比较将较大的元素往nums1末尾进行搬移2. 第一步结束后&#xff0c;nums2中可能会有数据没有搬移完&#xff0c;将nums…

结合scss实现黑白主题切换

是看了袁老师的视频后&#xff0c;自己做了一下练习。原视频地址&#xff1a; b站地址https://www.bilibili.com/video/BV15z4y1N7jB/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_sourcec6cf63302f28d94ebc02cbedcecc57ea首先创建一个全局的scs…

Python的基础:模块(Modules)和包(Packages)详解

1. 模块&#xff08;Modules&#xff09; 一个模块是一个包含了 Python 定义和语句的文件。模块可以包括变量、函数、类等&#xff0c;并且提供了一种将相关代码组织成可重用单元的方式。一个模块的定义通常包括以下几个方面&#xff1a;   1&#xff09;文件扩展名&#xff…

17. Series.dt.month-提取日期数据中的月份信息

【目录】 文章目录 17. Series.dt.month-提取日期数据中的月份信息1. 知识回顾-创建一个Series对象2. 知识回顾-pd.to_datetime()将数据转换为pandas中的日期时间格式3. 实例化类相关知识4. Series.dt.month是什么&#xff1f;5. 如何使用Series.dt.month&#xff1f;6. Series…

【数据库原理及应用教程】第三章 SQL

文章目录 建立数据库创建数据库选择元组select多表查询 追加元组 insert嵌套子查询 元组删除命令 deleteUpdate命令 修正与撤销数据库SQL-DDL撤销与修改撤销基本表指定数据库关闭数据库 建立数据库 学生选课数据库SCT 学生表&#xff1a;Student(SNo char(8), Sname char(10)…

Ubuntu18.04安装Loam保姆级教程

系统环境&#xff1a;Ubuntu18.04.6 LTS 1.Loam的安装前要求&#xff1a; 1.1 ROS安装&#xff1a;参考我的另一篇博客 Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客还是那句话&#xff0c;有时候加了这行也不好使&#xff0c;我是疯狂试了20次&#xf…

stylelint报错at-rule-no-unknown

stylelint报错at-rule-no-unknown stylelint还将各种 sass -rules 标记mixin为include显示未知错误 at-rule-no-unknown ✖ stylelint --fix:Deprecation warnings: 78:1 ✖ Unexpected unknown at-rule "mixin" at-rule-no-unknown 112:3 ✖ Unexpected un…

2023 年 数维杯(A题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看数维杯A题&#xff01; 问题重述 1、俯仰力矩和俯…

【Rust】快速教程——冻结表达式

前言 以前谁是魔我杀谁&#xff0c;现在我杀谁谁就是魔。——《拔魔》 \;\\\;\\\; 目录 前言Rust基本知识结构体元组结构体局部作用域冻结字面量Vec元素的类型由第一个push进的类型确定type别名from和intoTryFrom和TryInto 表达式 Rust基本知识 结构体 #[derive(Debug)] str…

华为eNSP综合实验考试

VLAN信息表 设备名称 端口 链路类型 VLAN 参数 HZ-HZCampus-Agg01-S5731 GE0/0/1 Trunk PVID:1 Allow-pass&#xff1a;10 20 Eth-trunk1&#xff08;GE0/0/2,0/0/3,0/0/23&#xff09; Trunk PVID:1 Allow-pass&#xff1a;10 20 GE0/0/24 Access PVID&#xf…

vb.net 实时监控双门双向门禁控制板源代码

本示例使用设备介绍&#xff1a;实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) Imports System.Net.Sockets Imports System.Net Imports System.Text Imports System.ThreadingImports System.Net.NetworkInformation Imports System.Man…

Python函数进阶

函数进阶 一.函数多返回值二.函数多种传参方式三.匿名函数 一.函数多返回值 思考&#xff1a;如果一个函数有两个return&#xff0c;程序如下 只执行了一个return&#xff0c;原因是return可以退出当前函数&#xff0c;导致return下方代码不会执行 多个返回值 按照返回值的顺…

BananaPi BPI-M6(Raspberry Pi 5) Android 平板电脑镜像测试温度

我已经在本文中介绍了 全新的Banana Pi BPI-M6&#xff0c;并讨论了其与Raspberry Pi 5的硬件特性比较。 然后我将 Android 平板电脑固件上传到 eMMC&#xff0c;从而使 Banana Pi 实际可用。一开始有点坎坷&#xff0c;但文章中有更多内容。 在另一台电脑上&#xff0c;一切都…

Vatee万腾未来科技之航:Vatee创新引领的新纪元

在当今数字化时代&#xff0c;Vatee万腾科技正在开创一段引领未来的全新征程。以其卓越的创新能力和领导地位&#xff0c;Vatee万腾成为数字化领域的引领者。其未来科技之航展现了一种独特的数字化愿景&#xff0c;引领着科技创新进入新的纪元。 Vatee万腾在数字科技领域展现出…

如何使用功率信号源保证高精度测量

使用功率信号源是实现高精度测量的关键因素之一。在许多应用中&#xff0c;精确的功率信号源可以提供稳定、可靠的信号&#xff0c;帮助实现准确的测量结果。以下是使用功率信号源保证高精度测量的几个关键方面&#xff1a; 信号稳定性&#xff1a;在进行精确测量时&#xff0c…

热点检测/降级框架Akali的部分原理解析

发现个“轻量级本地化热点检测/降级框架 这个框架名为Akali,项目地址&#xff1a;https://gitee.com/bryan31/Akali主要有两个作用 1&#xff1a;热点检测及处理 2&#xff1a;降级检测及处理 从官网文档来看使用是比较简单的&#xff0c;一个注解就能搞定 怀着好奇的心情c…

光模块厂家如何提高千兆光模块和万兆光模块的可靠性

随着互联网的发展&#xff0c;光纤通信作为高速、稳定的通信方式越来越受到人们的关注。而千兆光模块和万兆光模块作为通信中必不可少的组成部分&#xff0c;其可靠性一直是厂家和用户所关注的重要问题。光模块的不可靠性会导致通信系统的故障和影响用户的体验&#xff0c;因此…

networkx使用draw画图报错:TypeError: ‘_AxesStack‘ object is not callable

一、问题描述 在使用networkx的draw绘图时nx.draw(g,posnx.spring_layout(g))&#xff0c;报错&#xff1a;TypeError: _AxesStack object is not callable 二、原因 可能是当前python环境下的networkx和matplotlib的版本不匹配。我报错时的networkx2.8&#xff0c;matplotl…