vue3 Bus总线组件通讯(任意两组件通信)

文章介绍了Bus.js类,它包含$on、$emit和$off方法用于事件订阅、发布和取消订阅。在组件A.vue中,通过Bus.js监听并改变message。组件B.vue则触发事件和修改Bus.js中的msg值,展示了如何在Vue组件之间通过Bus.js进行通信。
摘要由CSDN通过智能技术生成

Bus.js 里有一个 Bus 类

eventList 是必须项,用来存放事件列表的。

constructor 里除了 eventList 外,其他都是自定义数据,公共数据就是存在这里的。

$on 方法用来注册事件。

$emit 方法可以调用 $on 里的事件。

$off 方法可以注销 eventList 里的事件。

Bus.js

class Bus {
  constructor() {
    // 收集订阅信息,调度中心
    // 事件列表,这项是必须的
    this.eventList = {},
    // 下面的都是自定义值
    this.msg = ref('这是一条总线的信息')
  }

  // 订阅
  $on(name, fn) {
    this.eventList[name] = this.eventList[name] || []
    this.eventList[name].push(fn)
  }

  // 发布
  $emit(name, data) {
    if (this.eventList[name]) {
      this.eventList[name].forEach((fn) => {
        fn(data)
      });
    }
  }

  // 取消订阅
  $off(name) {
      if (this.eventList[name]) {
      delete this.eventList[name]
    }
  }
}

export default new Bus()

组件A.vue

<template>
  <div> 
    <span>message: {{ message }}</span>
    <span>msg: {{ msg }}</span>
  </div>
  <Child></Child>
</template>

<script setup>
import Bus from './Bus.js'
import Child from './components/Child.vue'

const msg = $ref(Bus.msg)

const message = $ref('hello')

// 用监听的写法
Bus.$on('changeMsg', data => {
  message = data
})
</script>

组件B.vue

<template>
  <div>
    <button @click="handleBusEmit">触发Bus.$emit</button>
    <button @click="changeBusMsg">修改总线里的 msg</button>
  </div>
</template>

<script setup>
import Bus from '../Bus.js'

function handleBusEmit() {
  Bus.$emit('changeMsg', '雷猴啊')
}

function changeBusMsg() {
  Bus.msg.value = '在子组件里修改了总线的值'
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ahwangzc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值