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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!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脚本