vue3使用mitt.js實現(xiàn)各種組件間的通信
引言
我們在vue工程中,除開vue自帶的什么父子間,祖孫間通信,還有一個非常方便的通信方式,類似Vue2.x 使用 EventBus 進行組件通信,而 Vue3.x 推薦使用 mitt.js??梢詫崿F(xiàn)各個組件間的通信
優(yōu)點:首先它足夠小,僅有200bytes,其次支持全部事件的監(jiān)聽和批量移除,它還不依賴 Vue 實例,所以可以跨框架使用
1、在項目中引入mitt.js
npm install --save mitt
2、在項目中自定義ts文件引入并暴露mitt.js
我這里是在新建文件夾utils下新建文件命名app-events.ts
//app-events.ts文檔 /** * 業(yè)務(wù)中跨域調(diào)用、解決耦合問題 */ import mitt from 'mitt' const AppEvents = mitt() export default AppEvents
3、使用mitt.js
(1)在組件branchAside.vue,傳輸參數(shù)給組件 fileAside.vue (這兩個組件可以沒任何關(guān)系)
在組件branchAside.vue里面mitt.js使用如下:
聲明方法和傳參數(shù)
<script lang="ts" setup> import AppEvents from '@/utils/app-events' //引入mitt.js // 調(diào)用nameFn方法就可以觸發(fā) const nameFn = (item: string='test') => { // AppEvents.emit('自定義名字', 參數(shù)) AppEvents.emit('sideOpen', item) //使用emit傳送方法名字和參數(shù) } </script>
(2)在組件 fileAside.vue里面接受方法和參數(shù):
<script lang="ts" setup> import { onBeforeUnmount, onMounted } from 'vue' // 引入頁面初始化的生命周期和銷毀的生命周期 import AppEvents from '@/utils/app-events' // 引入mitt.js //在頁面初始生命周期,通過on監(jiān)聽方法和接受參數(shù) onMounted(() => { //AppEvents.on('方法名字',(val:any)=>{console.log('接收到的參數(shù)-->', val)}) AppEvents.on('sideOpen', (val: any) => { console.log('mitt---->', val) }) }) // 頁面銷毀,通過off注銷該自定義命名的方法 onBeforeUnmount(() => { AppEvents.off('sideOpen') }) </script>
拓展知識:vue3中mitt.js使用方法
由于在vue3.0中移除了vue實例的$on(), $off()方法,所以,在vue3.0取而代之的是用mitt.js第三方庫來實現(xiàn)平行組件間的通信,其特點是小巧,輕量。
在vue2中我們通過事件總線eventBus,來實現(xiàn)兩個平行組件之間的通信:
bus.js
import Vue from 'vue' // 創(chuàng)建vue實例 const Bus = new Vue() export default Bus
在具體的組件中:
A.vue
import Bus from './bus.js' // 發(fā)布一個事件 Bus.$emit('sendData', {name: 'Jack',age: 20})
B.vue
import Bus from './bus.js' // 訂閱一個事件 Bus.on('sendData', (param) => { console.log(param) })
main.js vue入口文件, 或者直接將bus實例掛在在vue的原型上:
import Vue from 'vue' const Bus = new Vue() Vue.prototype.$Bus = Bus
那么,在vue3我們也可以通過mitt.js來實現(xiàn)兩個平行組件之間的通信
首先安裝:npm install --save mitt
在項目src目錄下新建一個
mitt.js
文件
import mitt from 'mitt' // 創(chuàng)建mitt實例 const emitter = mitt() // 導(dǎo)出 export default emitter
在具體的組件實例中:
A.vue
import emitter from '@/mitt.js' // 發(fā)布一個事件,并傳遞參數(shù) emitter.emit('sendData', {name: 'David', 'age': 20})
B.vue
import emitter from '@/mitt.js' // 發(fā)布一個事件,并傳遞參數(shù) emitter.on('sendData', (param) => { console.log(param) })
// main.js import emitter from '@/mitt.js' app.config.globalProperties.$emitter = emitter
那么在vue3 setup 語法中:
const { getCurrentInstance } from 'vue' const proxy = getCurrentInstance() // 返回vue的實例 proxy.$emitter.on('foo', e => console.log(e)) // 訂閱事件 proxy.$emitter.emit('foo', {a: b}) // 發(fā)布事件
到此這篇關(guān)于vue3使用mitt.js實現(xiàn)各種組件間的通信的文章就介紹到這了,更多相關(guān)vue3 mitt.js組件通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3使用vuedraggable實現(xiàn)拖拽功能
這篇文章主要為大家詳細介紹了vue3使用vuedraggable實現(xiàn)拖拽功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04vue如何解決watch和methods值執(zhí)行順序問題
這篇文章主要介紹了vue如何解決watch和methods值執(zhí)行順序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08基于Element封裝一個表格組件tableList的使用方法
這篇文章主要介紹了基于Element封裝一個表格組件tableList的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Vue.js實現(xiàn)在下拉列表區(qū)域外點擊即可關(guān)閉下拉列表的功能(自定義下拉列表)
這篇文章主要介紹了Vue.js實現(xiàn)在下拉列表區(qū)域外點擊即可關(guān)閉下拉列表的功能(自定義下拉列表) ,需要的朋友可以參考下2017-05-05vue3中reactive數(shù)據(jù)被重新賦值后無法雙向綁定的解決
這篇文章主要介紹了vue3中reactive數(shù)據(jù)被重新賦值后無法雙向綁定的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05圖文詳解vue中proto文件的函數(shù)調(diào)用
這篇文章主要給大家介紹了vue中proto文件函數(shù)調(diào)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-08-08