Vue2.x использует EventBus для связи компонентов, а Vue3.x рекомендует использовать mitt.js.
Чем mitt.js лучше, чем EventBus на экземпляре Vue? Во-первых, он достаточно мал, всего 200 байт, а во-вторых, поддерживает мониторинг и пакетное удаление всех событий, не зависит от экземпляров Vue, поэтому его можно использовать между фреймворками, React или Vue, и даже проекты jQuery могут использовать тот же набор библиотек.
быстрый старт
npm install --save mitt
Режим 1, глобальная шина, глобальные свойства монтирования в файле записи vue main.js.
import { createApp } from 'vue';
import App from './App.vue';
import mitt from "mitt"
const app = createApp(App)
app.config.globalProperties.$mybus = mitt()
Способ 2: инкапсулируйте пользовательский файл шины транзакций mybus.js, создайте новый файл js и импортируйте его туда, где вы хотите его использовать.
import mitt from 'mitt'
export default mitt()
Способ 3, импортировать и использовать непосредственно в компоненте. Этот метод рекомендуется для всех, поскольку децентрализованным способом легче управлять и устранять проблемы.
<template>
<img alt="Vue logo" src="./assets/logo.png" />
<HelloWorld msg="Hello Vue 3.0 + Vite" />
</template>
<script>
import mitt from 'mitt'
import HelloWorld from './components/HelloWorld.vue'
export default {
components: {
HelloWorld
},
setup (props) {
const formItemMitt = mitt()
return {
formItemMitt
}
}
}
</script>
Как пользоваться
Фактически использование mitt аналогично EventEmitter: события добавляются методом on, удаляются методом off и очищаются методом clear.
import mitt from 'mitt'
const emitter = mitt()
// listen to an event
emitter.on('foo', e => console.log('foo', e) )
// listen to all events
emitter.on('*', (type, e) => console.log(type, e) )
// fire an event
emitter.emit('foo', { a: 'b' })
// clearing all events
emitter.all.clear()
// working with handler references:
function onFoo() {}
emitter.on('foo', onFoo) // listen
emitter.off('foo', onFoo) // unlisten
Следует отметить, что импортированная перчатка представляет собой вызов функции, а не новый метод. При удалении события вам необходимо передать имя и функцию-ссылку, которая определяет событие.
основной принцип
Принцип очень простой, то есть функция сохраняется методом карты. Менее 30 строк кода после обрезки.
export default function mitt(all) {
all = all || new Map();
return {
all,
on(type, handler) {
const handlers = all.get(type);
const added = handlers && handlers.push(handler);
if (!added) {
all.set(type, [handler]);
}
},
off(type, handler) {
const handlers = all.get(type);
if (handlers) {
handlers.splice(handlers.indexOf(handler) >>> 0, 1);
}
},
emit(type, evt) {
((all.get(type) || [])).slice().map((handler) => { handler(evt); });
((all.get('*') || [])).slice().map((handler) => { handler(type, evt); });
}
};
}
Vue3 полностью удален из экземпляра$on
,$off
и$once
метод.$emit
Все еще часть существующего API, поскольку она используется для запуска событий, которые декларативно присоединены родительским компонентом.