vue--Mitt全局事件的发布和订阅与取消订阅(也就是跨组件通讯)
Mitt
Mitt是一个体积极小的第三方消息发布/订阅式JavaScript库
官方文档是与框架无关的,所以这个玩意其实React、Vue都可以用
安装mitt库 1 npm i mitt -S 使用mitt库 在单独的文件暴露出事件总线对象 // mitt库默认导出的是一个函数,我们需要执行它从而得到事件总线的对象 /* eventbus.js */ import mitt from 'mitt' const emitter = mitt() export default emitter 在指定组件中导入并使用它 复制代码 /* one.vue */ // 模板代码 // 导入事件总线 import emitter from "@/utils/eventbus.js"; // methods代码 send(){ // 触发自定义总线why,并传入一个对象 emitter.emit("updateList",{name:'bbv',age:22}) } 复制代码 复制代码 /* two.vue */ // 导入事件总线 import emitter from "./utils/eventbus.js"; // 注册updataList事件总线 created(){ emitter.on("updateList",msg=>{ console.log(msg) }) } 复制代码 取消所有的mitt事件 emitter.all.clear() 取消指定的mitt事件 // 回调定义在外部,类似于setTimeout function onXxx(){} emitter.on('foo',onXxx) //监听 emitter.off('foo',onXxx) //取消监听
安装 在项目的根目录下执行: $ npm i mitt --save 导入 在 src/下新建一个 bus.js文件,内容如下: /* bus.js */ import mitt from "mitt"; const bus = {} const emitter = mitt() bus.$on = emitter.on bus.$off = emitter.off bus.$emit = emitter.emit export default bus 这段代码引入了mitt,并利用mitt()构造器生成了一个emit实例,同时把 on、off和 emit方法赋值给了空对象 bus,作为静态方法 打开 src/main.js内容如下: /* main.js */ import { createApp } from 'vue' import App from './App.vue' createApp(App).mount('#app') 改造 main.js,导入刚才的 bus对象,并挂载到全局 改造后的 main.js: /* main.js */ import { createApp } from 'vue' import App from './App.vue' import bus from './bus' const app = createApp(App) app.config.globalProperties.$bus = bus app.mount('#app') 使用 这里,我们在父、子组件间通过刚才挂载的全局对象 $bus来进行事件传递,并使用Vue3新增的 reactive来实现一个响应式组件 改造 改造默认模板里的 src/App.vue和 src/components/HelloWorld.vue,改造后的 App.vue:![]()
改造后的 HelloWorld.vue: class="hello">{{ msg }}
For a guide and recipes on how to configure / customize this project,
check out the vue-cli documentationa >.Installed CLI Plugins
- for="i in links" :key="i.text"> {{ i.text }}
Essential Links
Ecosystem
- vue-routera >
- vuex
- <a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener" >vue-devtoolsa >
- vue-loadera >
- <a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener" >awesome-vuea >