【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

相关文章
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
143 64
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
39 8
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
2月前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
2月前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
3月前
|
JavaScript 调度
Vue事件总线(EventBus)使用指南:详细解析与实战应用
Vue事件总线(EventBus)使用指南:详细解析与实战应用
107 1
|
5月前
|
JavaScript
Vue学习之--------全局事件总线(2022/8/22)
这篇文章介绍了Vue中全局事件总线(GlobalEventBus)的概念和使用方法,它允许不同组件之间进行通信。文章通过图解和代码实例详细解释了如何安装全局事件总线、在组件中接收和提供数据,以及如何在组件销毁前解绑事件,以避免潜在的内存泄漏问题。
Vue学习之--------全局事件总线(2022/8/22)
|
8月前
|
JavaScript
解释 Vue 的事件总线和 emits 属性。
解释 Vue 的事件总线和 emits 属性。
91 3
|
8月前
|
JavaScript
在Vue中,如何使用事件总线来传递数据和触发事件?
在Vue中,如何使用事件总线来传递数据和触发事件?
115 0

热门文章

最新文章