UNPKG

vue3-eventbus

Version:

A friendly event bus for Vue3

186 lines (159 loc) 3.68 kB
<p align="center"> <img src="https://i.imgur.com/FDytx8i.png" width="200" height="200" alt="vue3-eventbus" style="border-radius:40px; opacity:0.8" > <br> <a href="https://www.npmjs.org/package/vue3-eventbus"><img src="https://img.shields.io/npm/v/vue3-eventbus.svg" alt="npm"></a> </p> # Vue3-Eventbus Tiny event bus plugin for Vue3. ## Why 使用原因 Vue3实例不再提供`$on``emit`函数,官方推荐引入外部工具实现,使用本插件可以让你更轻松的在Vue3中使用轻量且功能完善eventBus [不引入插件的用法](#native-usage-without-vue3\-bus) App instance dont't have `$on` and `$emit` methods anymore in Vue3. > Remove \$on, \$off and \$once instance methods. Vue instances no longer implement the event emitter interface. > -- [active-rfcs/0020-events-api-change.md](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0020-events-api-change.md) So the RFC suggests using a third-party library instead. But you have to do some repetitive work for it. This tiny tool can solve this problem for you. ## Install 安装 ```sh $ npm install --save vue3-eventbus ``` ## Usage 用法 **use** ```js // import {createApp} from 'vue import eventBus from 'vue3-eventbus' // const app = createApp(App) app.use(eventBus) ``` **emit** ```js // Button.vue import bus from 'vue3-eventbus' // or: import { bus } from 'vue3-eventbus' export default { setup() { // fire an event bus.emit('foo', { a: 'b' }) } } ``` **listen/unlisten** ```js // Panel.vue import bus from 'vue3-eventbus' export default { setup() { // listen to an event bus.on('foo', e => console.log('foo', e) ) // listen to all events bus.on('*', (type, e) => console.log(type, e) ) // working with handler references: function onFoo() {} bus.on('foo', onFoo) // listen bus.off('foo', onFoo) // unlisten } } ``` ### Advanced Usage 更多用法 **Access by instance 通过实例访问** Don't need to import `vue3-eventbus` 不需要import `vue3-eventbus` ```js export default { created() { this.$eventBus.emit('foo') } } ``` **Access by inject method 通过inject访问** Have to import `inject` api from `vue` ```js import `inject` from 'vue' export default { setup() { const bus = inject('$eventBus') bus.emit('foo') } } ``` ## Options 配置 app.use(bus, options) ```js defaultOptions = { // Access by instance 是否挂载在全局 global: true, // Access by inject 是否provide inject: true, // 实例上挂载的名称 globalPropertyName: '$eventBus', // 通过inject引入的名称 injectName: '$eventBus' } ``` **example** 修改挂载在应用上的名称 ```js // main.js app.use(bus, { globalPropertyName: '$ev' }) // Button.vue created() { this.$ev.emit('click', {time: Date.now()}) } ``` | | | | | | | ## Native usage without vue3-eventbus 不使用vue3-eventbus插件的原生用法 ```js // bus.js // + + + export default { on(){ // ... } off(){ // ... } emit(){ // ... } } // main.js // + import $bus from './lib/helpers/bus.js' // + app.provide('$bus', $bus) // + app.config.globalProperties.$bus = $bus // Button.vue // + import { inject } from 'vue' setup() { // import and inject in every component // + const $bus = inject('$bus') $bus.emit('click') } // Panel.vue // + import { inject } from 'vue' setup() { // + const $bus = inject('$bus') $bus.on('click') } // Page.vue import { inject } from 'vue' setup() { const $bus = inject('$bus') $bus.off('click') } ```