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


    目录

    一、全局事件总线

    作用

    安装

    组件使用案例

    案例分析

    组件一(小明)

    组件二(小红)

    效果展示

    二、订阅与发布 

    安装

    组件使用案例

    案例分析

    组件一(小明)

    组件二(小红)

    效果展示


    一、全局事件总线

    作用

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

    安装

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

    1. new Vue({
    2. render: h => h(App),
    3. beforeCreate(){
    4. Vue.prototype.$bus = this
    5. }
    6. }).$mount('#app')

    组件使用案例

    案例分析

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

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

    发送代码如下

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

    接收代码如下

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

    销毁代码如下

    需要一个点击事件来触发

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

    组件一(小明)

    1. <script>
    2. // import pubsub from 'pubsub-js'
    3. export default {
    4. name: 'XiaoMing',
    5. data(){
    6. return{
    7. name:'小明',
    8. age:20
    9. }
    10. },
    11. methods:{
    12. sendMsg(){
    13. // pubsub.publish('usname',this.name)
    14. this.$bus.$emit('getName',this.name)
    15. },
    16. del(){
    17. this.$bus.$off('getName')
    18. console.log('已销毁');
    19. }
    20. },
    21. mounted(){
    22. // pubsub.subscribe('age',(e,page)=>{
    23. // console.log('小明得到小红',e,page);
    24. // })
    25. this.$bus.$on('getAge',(age)=>{
    26. console.log('小明得到的年龄',age);
    27. })
    28. }
    29. }
    30. script>
    31. <style>
    32. style>

    组件二(小红)

    1. <script>
    2. // import pubsub from 'pubsub-js'
    3. export default {
    4. name:'XiaoHong',
    5. data(){
    6. return{
    7. name:'小红',
    8. age:18
    9. }
    10. },
    11. methods:{
    12. sendAge(){
    13. // pubsub.publish('age',this.age)
    14. this.$bus.$emit('getAge',this.age)
    15. },
    16. // noRead(){
    17. // pubsub.unsubscribe(this.del)
    18. // }
    19. },
    20. mounted(){
    21. // this.del=pubsub.subscribe('usname',(q,msg)=>{
    22. // console.log('小红得到小明',q,msg)
    23. // }),
    24. this.$bus.$on('getName',(name)=>{
    25. console.log( '小红得到的名字',name);
    26. })
    27. },
    28. }
    29. script>
    30. <style>
    31. style>

    效果展示

    二、订阅与发布 

    安装

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

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

    组件使用案例

    案例分析

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

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

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

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

    第三步在小红组件订阅

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

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

    pubsub.unsubscribe(this.del)

    组件一(小明)

    1. <script>
    2. import pubsub from 'pubsub-js'
    3. export default {
    4. name: 'XiaoMing',
    5. data(){
    6. return{
    7. name:'小明',
    8. age:20
    9. }
    10. },
    11. methods:{
    12. sendMsg(){
    13. pubsub.publish('usname',this.name)
    14. // this.$bus.$emit('getName',this.name)
    15. },
    16. // del(){
    17. // this.$bus.$off('getName')
    18. // console.log('已销毁');
    19. // }
    20. },
    21. mounted(){
    22. pubsub.subscribe('age',(e,page)=>{
    23. console.log('小明得到小红',e,page);
    24. })
    25. // this.$bus.$on('getAge',(age)=>{
    26. // console.log('小明得到的年龄',age);
    27. // })
    28. }
    29. }
    30. script>
    31. <style>
    32. style>

    组件二(小红)

    1. <script>
    2. import pubsub from 'pubsub-js'
    3. export default {
    4. name:'XiaoHong',
    5. data(){
    6. return{
    7. name:'小红',
    8. age:18
    9. }
    10. },
    11. methods:{
    12. sendAge(){
    13. pubsub.publish('age',this.age)
    14. // this.$bus.$emit('getAge',this.age)
    15. },
    16. noRead(){
    17. pubsub.unsubscribe(this.del)
    18. }
    19. },
    20. mounted(){
    21. this.del=pubsub.subscribe('usname',(q,msg)=>{
    22. console.log('小红得到小明',q,msg)
    23. })
    24. // this.$bus.$on('getName',(name)=>{
    25. // console.log( '小红得到的名字',name);
    26. // })
    27. },
    28. }
    29. script>
    30. <style>
    31. style>

    效果展示

     

  • 相关阅读:
    C++11新特性学习笔记
    刷题分析工具
    接扫理解.exe文件的结构原理即运行过程
    《计算机视觉》:图像滤波与边缘检测
    GaussDB OLTP 云数据库配套工具DAS
    使用企业微信移动办公效果如何?
    (附源码)计算机毕业设计ssm《Python程序设计》教辅系统
    wps excel js编程
    YOLOv5算法改进--通过yaml文件添加注意力机制【附代码】
    配置类信息赋值为Java静态变量「扩展点实战系列》」- 第441篇
  • 原文地址:https://blog.csdn.net/yzq0820/article/details/126368104