vue3_兄弟组件传参(EventBus)& Mitt

兄弟组件也可以利用父传子,子传父的等实现,不再重复记录了

1.手写EventBus

目录结构:

 bus.ts

type ParamsKey = string | number | symbol

type List = {
    [key:ParamsKey]:Array<Function>
}
class Bus {
    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
    }
    Off(name:string){
        if(this.list[name]){
            delete this.list[name]
        }
    }
}
let bus = new Bus()
export default bus

A.vue


<template>
    <div class="container">A组件
            <el-button @click="toEmit">派发emit</el-button>
    </div>
</template>

<script setup lang="ts">
import { ref,inject,Ref } from 'vue'
import bus from './bus'
const flag = ref<Boolean>(false)
const toEmit = () =>{
   bus.emit('fromA',flag)
}

B.vue

<template>
  <div class="container">B组件{{ con }}</div>
</template>

<script setup lang="ts">
import {ref,onMounted,onBeforeMount,onUpdated} from 'vue'
import bus from './bus'
const con = ref()
onBeforeMount(()=>{
    bus.on('fromA',(res:boolean)=>{
        console.log(res);
        con.value = res
    })
    
})
onUpdated(()=>{
    console.log('update');
    bus.Off('fromA')
})
</script>

index.vue

<template>
  <A></A>
  <B></B>
</template>

<script setup lang="ts">
import A from './A.vue'
import B from './B.vue'
</script>

2.使用官方推荐的Mitt

mitt.ts

import mitt from 'mitt'
export const bus = mitt()

A.vue

<template>
    <div class="container">A组件
            <el-button @click="toEmit">派发emit</el-button>
    </div>
</template>

<script setup lang="ts">
import { ref,inject,Ref } from 'vue'
import {bus} from './mitt'
const flag = ref<Boolean>(false)
const toEmit = () =>{
   bus.emit('fromA',flag)
}

B.vue

<template>
  <div class="container">B组件{{ con }}</div>
</template>

<script setup lang="ts">
import {ref,onMounted,onBeforeMount,onUpdated} from 'vue'
import {bus} from './mitt'
const con = ref()
onBeforeMount(()=>{
    bus.on('fromA',(res:boolean)=>{
        console.log(res);
        con.value = res
    })
    
})
onUpdated(()=>{
    console.log('update');
    bus.Off('fromA')
})
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值