两种方案

1.借助父组件传参

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

  1. <template>
  2. <div>
  3. <A @on-click="getFalg"></A>
  4. <B :flag="Flag"></B>
  5. </div>
  6. </template>
  7. <script setup lang='ts'>
  8. import A from './components/A.vue'
  9. import B from './components/B.vue'
  10. import { ref } from 'vue'
  11. let Flag = ref<boolean>(false)
  12. const getFalg = (flag: boolean) => {
  13. Flag.value = flag;
  14. }
  15. </script>
  16. <style>
  17. </style>

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

2.Event Bus

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

  1. type BusClass<T> = {
  2. emit: (name: T) => void
  3. on: (name: T, callback: Function) => void
  4. }
  5. type BusParams = string | number | symbol
  6. type List = {
  7. [key: BusParams]: Array<Function>
  8. }
  9. class Bus<T extends BusParams> implements BusClass<T> {
  10. list: List
  11. constructor() {
  12. this.list = {}
  13. }
  14. emit(name: T, ...args: Array<any>) {
  15. let eventName: Array<Function> = this.list[name]
  16. eventName.forEach(ev => {
  17. ev.apply(this, args)
  18. })
  19. }
  20. on(name: T, callback: Function) {
  21. let fn: Array<Function> = this.list[name] || [];
  22. fn.push(callback)
  23. this.list[name] = fn
  24. }
  25. }
  26. export default new Bus<number>()

然后挂载到Vue config 全局就可以使用啦
————————————————
版权声明:本文为CSDN博主「小满zs」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq1195566313/article/details/123158620