美文网首页
Vue3_24(兄弟组件传参和Bus)

Vue3_24(兄弟组件传参和Bus)

作者: BingJS | 来源:发表于2022-12-12 19:02 被阅读0次

    1. 借助父组件传参

    例如父组件为App 子组件为A 和 B他两个是同级的

    <template>
        <div>
            <A @on-click="getFalg"></A>
            <B :flag="Flag"></B>
        </div>
    </template>
        
    <script setup lang='ts'>
    import A from './components/A.vue'
    import B from './components/B.vue'
    import { ref } from 'vue'
    let Flag = ref<boolean>(false)
    const getFalg = (flag: boolean) => {
       Flag.value = flag;
    }
    </script>
        
    <style>
    </style>
    

    A 组件派发事件通过App.vue 接受A组件派发的事件然后在Props 传给B组件 也是可以实现的
    缺点就是比较麻烦 ,无法直接通信,只能充当桥梁

    2. Event Bus

    我们在Vue2 可以使用emit 传递on监听 emit传递过来的事件
    这个原理其实是运用了JS设计模式之发布订阅模式

    type BusClass<T> = {
        emit: (name: T) => void
        on: (name: T, callback: Function) => void
    }
    type BusParams = string | number | symbol 
    type List = {
        [key: BusParams]: Array<Function>
    }
    class Bus<T extends BusParams> implements BusClass<T> {
        list: List
        constructor() {
            this.list = {}
        }
        emit(name: T, ...args: Array<any>) {
            let eventName: Array<Function> = this.list[name]
            eventName.forEach(ev => {
                ev.apply(this, args)
            })
        }
        on(name: T, callback: Function) {
            let fn: Array<Function> = this.list[name] || [];
            fn.push(callback)
            this.list[name] = fn
        }
    }
     
    export default new Bus<number>()
    

    然后挂载到Vue config 全局就可以使用啦

    相关文章

      网友评论

          本文标题:Vue3_24(兄弟组件传参和Bus)

          本文链接:https://www.haomeiwen.com/subject/ntvsdrtx.html