Vue3 使用 Event Bus
本文已整理到 Github,地址 👉 blog。
如果我的内容帮助到了您,欢迎点个 Star
🎉🎉🎉 鼓励鼓励 :) ~~
我希望我的内容可以帮助你。现在我专注于前端领域,但我也将分享我在有限的时间内看到和感受到的东西。
在 Vue2 中,创建 Event Bus 如下:
export const bus = new Vue()
-
bus.$on(...)
-
bus.$emit(...)
在 Vue3 中,Vue 不再是构造函数,而是 Vue.createApp({})
返回一个没有 $on
、$emit
和 $once
方法的对象。
根据官方文档 Vue 3 迁移指南所建议的,我们可以使用 mitt 或 tiny-emitter 库在组件之间调度事件。
这里我们使用 mitt,它的源码也很简单,👉 地址。
安装
pnpm i mitt
您也可以单独把代码拷贝一份到项目,代码量较少。
用法
与 Vue2 一样,封装为 myBus.js
:
-
import mitt from 'mitt'
-
export default mitt()
或者,你也可以定义为全局变量:
-
import { createApp } from 'vue'
-
import App from './App.vue'
-
import mitt from 'mitt'
-
-
const app = createApp(App)
-
app.config.globalProperties.emitter = mitt()
然后,封装一个 hooks:
-
// src/hooks/useEmitter.js
-
import { getCurrentInstance } from 'vue'
-
-
export default function useEmitter() {
-
const internalInstance = getCurrentInstance()
-
const emitter = internalInstance.appContext.config.globalProperties.emitter
-
-
return emitter
-
}
当然,为了方便管理,你也可以在需要用到的地方单独引入 mitt。
示例
假设我们有一个 sidebar
和 header
,其中包含一个关闭/打开侧栏的按钮,我们需要该按钮来切换侧边栏组件内的某些属性。
点击按钮发出 toggle-sidebar
带有一些 payload 的事件:
-
<template>
-
<button @click="toggleSidebar">toggle</button>
-
</template>
-
<script setup>
-
import { ref } from 'vue'
-
import useEmitter from '@/hooks/useEmitter'
-
-
const sidebarOpen = ref(true)
-
const emitter = useEmitter()
-
-
const toggleSidebar = () => {
-
sidebarOpen.value = !sidebarOpen.value
-
emitter.emit('toggle-sidebar', sidebarOpen.value)
-
}
-
</script>
在侧边栏中接收带有 payload 的事件:
-
<template>
-
<aside class="sidebar" :class="{'sidebar--toggled': !isOpen}">
-
{{ isOpen }}
-
</aside>
-
</template>
-
<script setup>
-
import { ref, onMounted } from 'vue'
-
import useEmitter from '@/hooks/useEmitter'
-
-
const isOpen = ref(true)
-
const emitter = useEmitter()
-
-
onMounted(() => {
-
emitter.on('toggle-sidebar', (isOpen) => {
-
isOpen.value = isOpen
-
})
-
})
-
</script>
更多资料
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhghecfb
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13