-
Vue 3 中没有事件总线。所以$on 将不起作用。见:https://v3.vuejs.org/guide/migration/events-api.html#events-api
-
建议您使用外部库创建事件总线,除非您想利用受支持的基于父子事件的通信,在这种通信中,子节点发出只能由父节点监听的事件。见:https://v3.vuejs.org/guide/component-custom-events.html#custom-events
-
要为您的应用程序实现事件总线,请确保您正在发射(触发)事件并使用发射器的相同实例来监听它们。否则,它将不起作用。
-
对于带有 Vue js 的事件总线,我更喜欢 emittery (https://github.com/sindresorhus/emittery)。它具有出色的 Typescript 支持,功能强大。我也通过 Adonisjs 框架在 Node js 上使用它。
-
创建一个 useEvent 钩子
//文件:composables/useEvent.ts
import Emittery from 'emittery';
const emitter = new Emittery();
// Export the Emittery class and its instance.
// The `emitter` instance is more important for us here
export {emitter, Emittery};
// 导出 Emittery 类及其实例
出口{发射器,发射器};
- 在任何 vue 组件中监听一个事件
// 文件:AnyVueComponent.vue
<script lang="ts">
import { defineComponent, onMounted } from 'vue';
import {emitter} from '../composables/useEvent'
export default defineComponent({
name: 'ExampleComponent',
components: {},
props: {},
setup() {
onMounted(() => {
emitter.on('event-name', async () => {
// Perform actions. async...await is supported
});
})
return {};
},
});
</script>
- 在任何 vue 组件中发出事件
<script lang="ts">
import { defineComponent, onMounted } from 'vue';
import {emitter} from '../composables/useEvent'
export default defineComponent({
name: 'ExampleComponent',
components: {},
props: {},
setup() {
void emitter.emit('event-name');
return {};
},
});
</script>
- 请注意,您可以将
useEvent 挂钩导入任何非Vue 文件,它会起作用。它只是一个 JS/TS 文件。
对于 Quasar 框架:
- 创建启动文件
./node_modules/.bin/quasar new boot EventBus --format ts
- // 文件:EventBus.ts
import { boot } from 'quasar/wrappers';
import Emittery from 'emittery';
const emitter = new Emittery();
export default boot(({ app }) => {
app.config.globalProperties.$event = emitter;
});
// Export the Emittery class and its instance
export { emitter, Emittery };
- 注册
quasar.conf.js文件
module.exports = configure(function(/* ctx */){
return {
boot: [
...,
'EventBus',
],
}
}
- 在任何 vue 组件中监听一个事件
// 文件:AnyVueComponent.vue
<script lang="ts">
import { defineComponent, onMounted } from 'vue';
import {emitter} from '../boot/EventBus'
export default defineComponent({
name: 'ExampleComponent',
components: {},
props: {},
setup() {
onMounted(() => {
emitter.on('event-name', async () => {
// Perform actions. async...await is supported
});
})
return {};
},
});
</script>
- 在任何 vue 组件中发出事件
<script lang="ts">
import { defineComponent, onMounted } from 'vue';
import {emitter} from '../boot/EventBus'
export default defineComponent({
name: 'ExampleComponent',
components: {},
props: {},
setup() {
void emitter.emit('event-name');
return {};
},
});
</script>