Vue: 兄弟组件利用自定义Bus传参

vite.config.ts

复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import * as path from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      '@': path.resolve(path.resolve(), 'src')
    }
  }
})
复制代码

 

 

复制代码
import * as Console from 'console'


type BusClass = {
  emit: (name: string) => void,
  on: (name: string, callback: Function) => void
}

type CallbackName = string | number | symbol

type List = {
  [key: CallbackName]: Array<Function>
}

class Bus implements BusClass {
  list: List

  constructor() {
    this.list = {}
  }

  emit(name: string, ...args: Array<any>) {
    let callbacks: Array<Function> | undefined = this.list[name]
    if (callbacks === undefined) {
      console.warn(`event "${name}" is not bound`)
      return
    }
    callbacks.forEach(callback => {
      console.log('emit', this)
      callback.apply(this, args)  // this 为 Bus.ts 导出的实例, on方法如果使用ArrowFunction, 则无法使用this
    })
  }

  on(name: string, callback: Function) {
    let callbacks: Array<Function> = this.list[name] || []
    callbacks.push(callback)
    this.list[name] = callbacks
  }
}

export default new Bus()
复制代码

App.vue

复制代码
<template>
  <A></A>
  <B></B>
</template>

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


</script>


<style lang="less">

</style>
复制代码

A.vue

复制代码
<template>
  <div>
    <button @click="emitB">emit</button>
  </div>
</template>

<script lang="ts" setup>
import bus from '@/Bus.ts'
import { Ref, ref } from 'vue'


const emit = defineEmits(['on-click'])
let flag: Ref = ref<boolean>(true)
const emitB = () => {
  flag.value = ! flag.value
  bus.emit('on-click', flag)
}
</script>
复制代码

B.vue

复制代码
<template>
  <div>
    <time>{{ flag }}</time>
  </div>
</template>

<script lang="ts" setup>
import bus from '@/Bus.ts'
import { Ref, ref } from 'vue'


const flag = ref<boolean>(false)
// bus.on('on-click', (_flag: Ref) => {
//   console.dir(flag)
//   console.log('on',this)
//   flag.value = _flag.value
// })
bus.on('on-click', function (_flag: Ref) {
  console.dir(_flag)
  console.log('on', this)
  flag.value = _flag.value
})
</script>
复制代码

 

 

 

posted @   ascertain  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2021-03-26 OOM Killer
2021-03-26 Java Spring cloud classic architecture
2021-03-26 Samba
2021-03-26 MySQL常用shell脚本
点击右上角即可分享
微信分享提示