【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

相关文章
|
14天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
117 64
|
14天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
24 8
|
14天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
27天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
27天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
1月前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
17天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
19天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
20天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
23 1
vue学习第一章
|
20天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
22 1
vue学习第三章