【Vue】非父子通信-event bus 事件总线

作用:非父子组件之间,进行简易消息传递。(复杂场景→ Vuex)

一、实现步骤

  1. 创建一个都能访问的事件总线 (空Vue实例) → utils/EventBus.js

    叫事件总线的原因是因为本质是它俩消息的接受和发送是利用了Vue的事件机制

    import Vue from 'vue'
    const Bus = new Vue()
    export default Bus
    
  2. A组件(接受方),监听Bus的 $on事件

    created () {
        // B组件通过触发事件传递了参数(发布消息),进而在A组件由于监听了这个消息,进而就会执行回调
        Bus.$on('sendMsg', (msg) => {
            this.msg = msg
        })
    }
    
  3. B组件(发送方),触发Bus的$emit事件

    Bus.$emit('sendMsg', '这是一个消息')
    

    68232839240


二、代码示例

EventBus.js

import Vue from 'vue'
const Bus = new Vue()
export default Bus

BaseA.vue(接受方)

<template>
  <div class="base-a">
    我是A组件(接受方)
    <p>{{msg}}</p>  
  </div>
</template>

<script>
import Bus from '../utils/EventBus'
export default {
  data() {
    return {
      msg: '',
    }
  },
  created() {
    Bus.$on('sendMsg', (msg) => {
      // console.log(msg)
      this.msg = msg
    })
  },
}
</script>

<style scoped>
.base-a {
  width: 200px;
  height: 200px;
  border: 3px solid #000;
  border-radius: 3px;
  margin: 10px;
}
</style>

BaseB.vue(发送方)

<template>
  <div class="base-b">
    <div>我是B组件(发布方)</div>
    <button @click="sendMsgFn">发送消息</button>
  </div>
</template>

<script>
import Bus from '../utils/EventBus'
export default {
  methods: {
    sendMsgFn() {
      Bus.$emit('sendMsg', '今天天气不错,适合旅游')
    },
  },
}
</script>

<style scoped>
.base-b {
  width: 200px;
  height: 200px;
  border: 3px solid #000;
  border-radius: 3px;
  margin: 10px;
}
</style>

BaseC.vue(接收方)

<template>
  <div class="base-c">
    我是C组件(接受方)
    <p>{{msg}}</p>  
  </div>
</template>

<script>
import Bus from '../utils/EventBus'
export default {
  data() {
    return {
      msg: '',
    }
  },
  created() {
    Bus.$on('sendMsg', (msg) => {
      // console.log(msg)
      this.msg = msg
    })
  },
}
</script>

<style scoped>
.base-c {
  width: 200px;
  height: 200px;
  border: 3px solid #000;
  border-radius: 3px;
  margin: 10px;
}
</style>

App.vue

<template>
  <div class="app">
    <BaseA></BaseA>
    <BaseB></BaseB>
    <BaseC></BaseC>
  </div>
</template>

<script>
import BaseA from './components/BaseA.vue'
import BaseB from './components/BaseB.vue'
import BaseC from './components/BaseC.vue'
export default {
  components:{
    BaseA,
    BaseB,
    BaseC
  }
}
</script>

<style>

</style>

相关推荐

  1. Vue3父子组件通信

    2024-06-06 21:54:03       63 阅读
  2. vue3+ts父子通信

    2024-06-06 21:54:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-06 21:54:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-06 21:54:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-06 21:54:03       82 阅读
  4. Python语言-面向对象

    2024-06-06 21:54:03       91 阅读

热门阅读

  1. 一篇想要成为Python编程大佬,看这篇就够了

    2024-06-06 21:54:03       35 阅读
  2. 通过Slf4j中的MDC实现在日志中添加用户IP功能

    2024-06-06 21:54:03       32 阅读
  3. BOOT ISO和DVD ISO的区别

    2024-06-06 21:54:03       30 阅读
  4. nacos增加修改配置实时生效

    2024-06-06 21:54:03       31 阅读
  5. redis集群

    2024-06-06 21:54:03       31 阅读
  6. VOJ 圣诞树 题解 最短路径 dijkstra算法

    2024-06-06 21:54:03       33 阅读
  7. Amazon Web Services 问题咨询笔记

    2024-06-06 21:54:03       29 阅读
  8. USB - Linux Drivers介绍

    2024-06-06 21:54:03       32 阅读
  9. 服务器硬件介绍(1)

    2024-06-06 21:54:03       24 阅读
  10. 【Linux】多进程基础

    2024-06-06 21:54:03       23 阅读