【Vue组件间通信】 全局事件总线、订阅与发布

简介: 本章学习全局事件总线、订阅与发布。

一、全局事件总线


作用

一种组件间通信的方式 适用于任意组件间通信。


安装

安装全局事件总线:在入口文件main.js中,给VM添加$bus,任意组件都可以在原型中调用。


new Vue({
  render: h => h(App),
  beforeCreate(){
     Vue.prototype.$bus  = this
  }
}).$mount('#app')


组件使用案例

案例分析

创建两个子组件,如下组件,其中注释内容是演示订阅与发布无视即可


下面代码所演示的是,小明组件给小红组件姓名“小明”,小红组件给小明组件“年龄”,主要通过自定义事件,其中小明组件自定义“getName”,需要传递给小红组件,小红组件就需要“getName”来接收,也可以销毁传递


发送代码如下

this.$bus.$emit('getName',this.name)//this.name是所要传递的值,


接收代码如下

this.$bus.$on('getName',(name)=>{
            console.log( '小红得到的名字',name);
          })


销毁代码如下

需要一个点击事件来触发

this.$bus.$off('getName')


组件一(小明)

<template>
  <div>
  姓名:{{name}}年龄:{{age}}<button @click="sendMsg">给小红组件传姓名</button> <button @click="del">销毁传递</button>
  </div>
</template>
<script>
  // import pubsub from 'pubsub-js'
  export default {
   name: 'XiaoMing',
   data(){
  return{
    name:'小明',
    age:20
  }
   },
   methods:{
    sendMsg(){
    //   pubsub.publish('usname',this.name)
     this.$bus.$emit('getName',this.name)
    },
    del(){
    this.$bus.$off('getName')
    console.log('已销毁');
    }
   },
  mounted(){
  // pubsub.subscribe('age',(e,page)=>{
  //  console.log('小明得到小红',e,page);
  // })
  this.$bus.$on('getAge',(age)=>{
    console.log('小明得到的年龄',age);
  })
  }
  }
</script>
<style>
</style>
组件二(小红)
<template>
  <div>
  姓名:{{name}}年龄:{{age}} <button @click="sendAge">给小明组件传年龄</button><button >取消订阅</button>
  </div>
</template>
<script>
  // import pubsub from 'pubsub-js'
  export default {
   name:'XiaoHong',
   data(){
  return{
    name:'小红',
    age:18
  }
   },
   methods:{
  sendAge(){
    // pubsub.publish('age',this.age)
    this.$bus.$emit('getAge',this.age)
  },
  // noRead(){
  //  pubsub.unsubscribe(this.del)
  // }
   },
   mounted(){
  //   this.del=pubsub.subscribe('usname',(q,msg)=>{
  //    console.log('小红得到小明',q,msg)
  //   }),
    this.$bus.$on('getName',(name)=>{
    console.log( '小红得到的名字',name);
    })
   },   
  }
</script>
<style>
</style>


效果展示

微信图片_20220928194253.gif


二、订阅与发布


安装

一种组件间通信的方式,适用于任意组件间通信,如今有很多消息订阅与发布的包,在这里只介绍一种,pubsub-js。


打开终端输入命令:npm i pubsub-js


组件使用案例

案例分析

通过订阅与发布的方式,小明组件给小红组件姓名,小红组件给小明组件年龄


第一步我们需要引入: import pubsub from 'pubsub-js'


第二步通过在小明组件发布

pubsub.publish('usname',this.name) //usname:发布消息的名称,第二个参数:为发布内容

第三步在小红组件订阅

this.del=pubsub.subscribe('usname',(q,msg)=>{
     console.log('小红得到小明',q,msg)
    })


第四步想要取消订阅,自定义事件,绑定销毁,通过第三步的this.del

pubsub.unsubscribe(this.del)
组件一(小明)
<template>
  <div>
  姓名:{{name}}年龄:{{age}}<button @click="sendMsg">给小红组件传姓名</button> <button >销毁传递</button>
  </div>
</template>
<script>
  import pubsub from 'pubsub-js'
  export default {
   name: 'XiaoMing',
   data(){
  return{
    name:'小明',
    age:20
  }
   },
   methods:{
    sendMsg(){
     pubsub.publish('usname',this.name)
    //   this.$bus.$emit('getName',this.name)
    },
  //   del(){
  //  this.$bus.$off('getName')
  //  console.log('已销毁');
  //   }
   },
  mounted(){
  pubsub.subscribe('age',(e,page)=>{
    console.log('小明得到小红',e,page);
  })
  // this.$bus.$on('getAge',(age)=>{
  //  console.log('小明得到的年龄',age);
  // })
  }
  }
</script>
<style>
</style>


组件二(小红)

<template>
  <div>
  姓名:{{name}}年龄:{{age}} <button @click="sendAge">给小明组件传年龄</button><button @click="noRead">取消订阅</button>
  </div>
</template>
<script>
  import pubsub from 'pubsub-js'
  export default {
   name:'XiaoHong',
   data(){
  return{
    name:'小红',
    age:18
  }
   },
   methods:{
  sendAge(){
    pubsub.publish('age',this.age)
    // this.$bus.$emit('getAge',this.age)
  },
  noRead(){
    pubsub.unsubscribe(this.del)
  }
   },
   mounted(){
    this.del=pubsub.subscribe('usname',(q,msg)=>{
     console.log('小红得到小明',q,msg)
    })
  //   this.$bus.$on('getName',(name)=>{
  //  console.log( '小红得到的名字',name);
  //   })
   },
  }
</script>
<style>
</style>


效果展示

image.png

相关文章
|
5天前
|
JavaScript API
vue 批量自动引入并注册组件或路由等等
【10月更文挑战第12天】 vue 批量自动引入并注册组件或路由等等
|
5天前
|
JavaScript 前端开发 API
vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据
vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据
94 0
|
6天前
|
JavaScript 前端开发 UED
Vue 组件设计:构建生动多彩的树形结构组件
本文介绍了如何使用 Vue 构建一个功能强大的树形结构组件。该组件支持递归渲染节点及其子节点,提供了自定义节点颜色、文本和布局的功能。通过独特的样式处理不同层级的节点,展示出丰富的视觉效果。组件还支持动态布局和缩放,确保灵活的界面展示和用户体验。文章提供了详细的代码实现,包括 HTML、JavaScript 和 SCSS,帮助开发者快速集成和定制自己的树形结构组件。
30 0
Vue 组件设计:构建生动多彩的树形结构组件
|
5天前
|
人工智能 JavaScript 程序员
vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持
vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持
16 0
|
5天前
|
JavaScript API
Vue中使用require.context()自动引入组件和自动生成路由的方法介绍
Vue中使用require.context()自动引入组件和自动生成路由的方法介绍
9 0
|
5天前
|
JavaScript
Vue组件点击事件不触发的问题,添加事件修饰符native解决
Vue组件点击事件不触发的问题,添加事件修饰符native解决
59 0
|
6天前
|
JavaScript
在 Vue 3 中使用 DHTMLX 甘特图组件
本文将介绍如何在 Vue 3 项目中集成 DHTMLX 甘特图组件,详细讲解安装、模块导入以及基本用法。通过示例代码,您将学会如何配置甘特图的任务、样式和交互功能,帮助您在项目中更有效地管理和展示任务时间线。
11 0
|
9天前
|
JavaScript 调度
Vue事件总线(EventBus)使用指南:详细解析与实战应用
Vue事件总线(EventBus)使用指南:详细解析与实战应用
22 1
|
2月前
|
JavaScript
Vue学习之--------全局事件总线(2022/8/22)
这篇文章介绍了Vue中全局事件总线(GlobalEventBus)的概念和使用方法,它允许不同组件之间进行通信。文章通过图解和代码实例详细解释了如何安装全局事件总线、在组件中接收和提供数据,以及如何在组件销毁前解绑事件,以避免潜在的内存泄漏问题。
Vue学习之--------全局事件总线(2022/8/22)
|
5月前
|
JavaScript
解释 Vue 的事件总线和 emits 属性。
解释 Vue 的事件总线和 emits 属性。
67 3