vue3的事件总线

476 阅读1分钟

vue3从实例中完全删除了$on$off$once方法。这就代表vue2中的事件总线不能在vue3中继续使用了。官方推荐我们使用mitt或tiny-emitter代替,下面来总结下这两个库的使用。

mitt

安装

npm install --save mitt

创建bus/index.ts文件

import mitt, { Emitter } from 'mitt'

// 定义事件和事件对应的类型
type MittEvent = {
    // 事件foo的参数为{a:string}类型
    foo: {a:string},
    // 事件bar的参数为number|undefined类型
    bar?: number
}

const emitter: Emitter<MittEvent> = mitt<MittEvent>()

export default emitter

使用

import emitter from '@/bus'


// 触发一个事件,emit只能传递一个参数
emitter.emit('foo', { a: 'b' })

// 监听一个事件,回调函数的参数也只能有一个
emitter.on('foo', ev => console.log('foo', ev.a) )

// 监听所有事件,毁掉函数有两个参数,type: 事件类型,ev: 参数
emitter.on('*', (type, ev) => console.log(type, ev) )


// 清空所有事件
emitter.all.clear()

// 取消监听foo事件的onFoo函数
function onFoo() {}
emitter.on('foo', onFoo)
emitter.off('foo', onFoo)

// 取消监听foo事件的所有函数
emitter.off('foo')

tiny-emitter

安装

npm install tiny-emitter --save

创建bus/index.ts文件

const Emitter = require('tiny-emitter');
const emitter = new Emitter();

export default emitter

或者引入 tiny-emitter/instance,可以省去new的操作

const emitter = require('tiny-emitter/instance');

export default emitter

使用

import emitter from '@/bus'

// 触发事件, 可以传递多个参数
emitter.emit('some-event''arg1 value''arg2 value''arg3 value');

function func(arg1, arg2, arg3){
    console.log(arg1, arg2, arg3)
}
// 监听事件,接受多个参数
emitter.on('some-event', func);
// 监听事件,只监听一次
emitter.once('some-event', func);
// 解绑事件
emitter.off('some-event', func)