【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

相关文章
|
11天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
11天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
23天前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
26天前
|
JavaScript 前端开发 测试技术
组件化开发:创建可重用的Vue组件
【10月更文挑战第21天】组件化开发:创建可重用的Vue组件
24 1
|
27天前
|
JavaScript 前端开发 Java
《vue3第五章》新的组件,包含:Fragment、Teleport、Suspense
《vue3第五章》新的组件,包含:Fragment、Teleport、Suspense
32 2
|
27天前
|
Java
vue3知识点:Teleport组件
vue3知识点:Teleport组件
26 1
|
4天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
vue学习第四章
|
4天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
vue学习第九章(v-model)
|
4天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
vue学习第十章(组件开发)
|
10天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
下一篇
无影云桌面