vue3+ts的vue的兄弟组件传参,发布订阅者方式手动封装实现(EventBus)emit与on方法实现源码

本文展示了如何在Vue3中使用自定义事件总线Bus.ts来实现实例间通信。Bus.ts是一个简单的事件发布/订阅实现,用于在兄弟组件A和B之间传递数据。A组件通过调用Bus.emit发送数据,而B组件则通过Bus.on监听并接收数据更新其状态。此外,文章还提及了替代方案——使用mitt库作为更功能丰富的EventBus。
摘要由CSDN通过智能技术生成

以下是Bus.ts文件

type BusClass = {
    emit: (name: string) => void
    on: (name: string, callback: Function) => void
}
type pramsKey = string | number | symbol;

type List = {
    [key: pramsKey]: Array<Function>
}
class Bus implements BusClass {
    list: List
    constructor() {
        this.list = {}
    }
    emit(name: string, ...args: Array<any>) {
        let eventName: Array<Function> = this.list[name]
        eventName.forEach(fn => {
            fn.apply(this, args)
        })
    }
    on(name: string, callback: Function) {
        let fn: Array<Function> = this.list[name] || []
        fn.push(callback)
        this.list[name] = fn
    }
}
export default new Bus()
兄弟组件A组件代码
***使用Bus.emit传值***
<template>
    <div class="a_main">
        我是A组件
        <button @click="changeEmit">修改值</button>
    </div>
</template>

<script lang='ts' setup>
import { defineEmits, ref } from 'vue'
import Bus from '../Bus'
let flag = false;
const changeEmit = () => {
    flag = !flag
    Bus.emit('on-click', flag)
}
</script>

<style scoped lang="scss">
.a_main {
    width: 100%;
    height: 200px;
    background: red;
    color: #fff;
}
</style>

兄弟组件B组件代码
使用Bus.on接收值

<template>
    <div class="b_main">
        我是B组件{{ Flag }}
    </div>
</template>

<script lang='ts' setup>
import Bus from '../Bus'
import { ref } from 'vue'
let Flag = ref(false)
Bus.on('on-click', (flag: boolean) => {
    console.log(flag)
    Flag.value = flag
})
</script>

<style scoped lang="scss">
.b_main {
    width: 300px;
    height: 300px;
    background: blue;
}
</style>

如果我们不想使用这个,想使用更多功能的内置的写好的组件请点击下方链接,教你使用Mitt,vue3的EventBus
mitt用法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值