最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3中事件總線的具體使用

 更新時間:2023年04月11日 14:28:57   作者:zerotower  
本文主要介紹了Vue3中事件總線的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

導(dǎo)讀

在Vue2中,我們遇到復(fù)雜的組件通信時,經(jīng)常采用事件總線的方式來通信。其具體的思路就是實例化一個空白的Vue,并通過其提供的$on、$once$emit方法來進行通信。而在Vue3中,上述三個API已經(jīng)被移除了,那么我們又如何使用事件總線呢?

事件總線的本質(zhì)

Vue2中的$on、$once、$emit本質(zhì)上就是其內(nèi)部實現(xiàn)了一個EventEmitter(事件派發(fā)器),每一個事件都和若干回調(diào)相對應(yīng),只要事件被觸發(fā),那么就將執(zhí)行此事件所有對應(yīng)的回調(diào)。同時,在JavaScript中,該思想被廣泛地使用,尤其在Node.js的事件機制中,就是創(chuàng)建了一個EventEmitter實例,具體請自行查閱相關(guān)資料。因此,我們只需要實現(xiàn)一個簡單的EventEmitter,并全局傳遞到每一個組件中,就可以實現(xiàn)一個事件總線了。而全局傳遞,我們可以使用config.globalProperties綁定到每一個組件,也可以在根組件(main)中,通過provide提供總線,需要使用的組件使用inject注入。下面就讓我們來實現(xiàn)一下吧。

構(gòu)建一個EventEmitter

由于我們可能會有多條總線,我們還是把EventEmitter寫成類的方式,每一條總線都將是一個EventEmitter實例。以下是EventEmitter的簡單實現(xiàn),其只實現(xiàn)了on、once、emit三個API。

class EventEmitter{
    constructor(){
        this.callbacks={};
    }
    on(envetName,callback){
        if(!Array.isArray(this.callbacks[envetName])){
            this.callbacks[envetName]=[];
        }
        this.callbacks[envetName].push(callback);
    }
    emit(eventName,...args){
        if(Array.isArray(this.callbacks[eventName])){
            this.callbacks[eventName].forEach(callback=>callback(...args));
        }
    }
    off(eventName,callback){
        if(!Array.isArray(this.callbacks[eventName])){
            return
        }
        if(callback){
            this.callbacks[eventName].forEach(cb=>{
                if(callback===cb){
                    this.callbacks[eventName].splice(this.callbacks[eventName].indexOf(callback),1);
                }
            });
        } else{
            this.callbacks[eventName]=[];
        }
    }
    once(eventName,callback){
        const that=this;
        const fn=function(){
            callback.apply(that,[...arguments]);
            that.off(eventName,fn);
        }
        that.on(eventName,fn);
    }
}

具體的代碼基本上還是很好理解的,就不在本文解釋了,具體請自行查閱相關(guān)的資料。

將EventEmitter實例化并全局引入

上文已經(jīng)說了有兩種引入EventEmitter的方法,這里簡單地給個參考實例吧。

config.globalProperties方法

在main.js中

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
const app=createApp(App);
app.config.globalProperties.$event=new EventEmitter();
app.mount('#app')

在組件中:

//Comp1
<script setup>
import {getCurrentInstance} from "vue"
const vm=getCurrentInstance();
vm.proxy.$event.on('test',()=>{
    console.log('test event emit!')
})
</script>

//Comp2
<script setup>
import {getCurrentInstance} from "vue"
const vm=getCurrentInstance();
vm.proxy.$event.emit('test',"a","b")
</script>

但這種方法不太優(yōu)雅,不方便定義多條總線,建議使用下述的方法。

provide/inject

在main.js中

provide("eventBus1",new EventEmitter());
provide("eventBus2",new EventEmitter());

在組件中

//Comp1
<script setup>
import {inject} from "vue";
const bus1=inject("eventBus1")
bus1.on("bus1-on-event",()=>{
    console.log('eventBus1 on event emit!')
})
</script>
//Comp2
<script setup>
import {inject} from "vue";
const bus1=inject("eventBus1")
const bus2=inject("eventBus2")
bus2.on("bus2-on-event",()=>{
    console.log('eventBus2 on event emit!')
})
bus1.emit("bus1-on-event")
</script>
//Comp3
<script setup>
import {inject} from "vue";
const bus2=inject("eventBus2")
bus2.emit("bus2-on-event")
</script>

此方法中,使用inject也比使用getCurrentInstance.proxy更優(yōu)雅一些,且不使用就不必使用inject注入。

結(jié)束語

到此這篇關(guān)于Vue3中事件總線的具體使用的文章就介紹到這了,更多相關(guān)Vue3 事件總線內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 記一次vue跨域的解決

    記一次vue跨域的解決

    這篇文章主要介紹了vue跨域的解決方法,幫助大家解決前端跨域問題,感興趣的朋友可以參考下
    2020-10-10
  • Vue中如何判斷對象是否為空

    Vue中如何判斷對象是否為空

    這篇文章主要介紹了Vue中如何判斷對象是否為空,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 在vue項目中引用Iview的方法

    在vue項目中引用Iview的方法

    iView 是一套基于 Vue.js 的開源 UI 組件庫,主要服務(wù)于 PC 界面的中后臺產(chǎn)品。這篇文章主要介紹了在vue項目中引用Iview的方法,需要的朋友可以參考下
    2018-09-09
  • 使用vue2.6實現(xiàn)抖音【時間輪盤】屏保效果附源碼

    使用vue2.6實現(xiàn)抖音【時間輪盤】屏保效果附源碼

    前段時間看抖音,有人用時間輪盤作為動態(tài)的桌面壁紙,一時間成為全網(wǎng)最火的電腦屏保,后來小米等運用市場也出現(xiàn)了【時間輪盤】,有點像五行八卦,感覺很好玩,于是突發(fā)奇想,自己寫一個網(wǎng)頁版小DEMO玩玩,需要的朋友可以參考下
    2019-04-04
  • vue圓環(huán)百分比進度條組件功能的實現(xiàn)

    vue圓環(huán)百分比進度條組件功能的實現(xiàn)

    在一些頁面設(shè)置進度條效果給人一種很好的體驗效果,今天小編教大家vue圓環(huán)百分比進度條組件功能的實現(xiàn)代碼,代碼超級簡單啊,感興趣的朋友快來看下吧
    2021-05-05
  • 如何正確快速使用Vue中的插槽和配置代理

    如何正確快速使用Vue中的插槽和配置代理

    這篇文章主要介紹了正確快速使用Vue中的插槽和配置代理的相關(guān)知識,插槽分為三種,分別是默認插槽、具名插槽、作用域插槽,下面分別列出了如何使用這三種插槽,需要的朋友可以參考下
    2023-01-01
  • VUE中Non-Props屬性的使用

    VUE中Non-Props屬性的使用

    本文主要介紹了VUE中Non-Props屬性的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Vue?動態(tài)路由的實現(xiàn)詳情

    Vue?動態(tài)路由的實現(xiàn)詳情

    這篇文章主要介紹了Vue?動態(tài)路由的實現(xiàn),動態(tài)路由是一個常用的功能,根據(jù)后臺返回的路由json表,前端動態(tài)顯示可跳轉(zhuǎn)的路由項,本文主要實現(xiàn)的是后臺傳遞路由,前端拿到并生成側(cè)邊欄的一個形勢,需要的朋友可以參考一下
    2022-06-06
  • Vue 解決在element中使用$notify在提示信息中換行問題

    Vue 解決在element中使用$notify在提示信息中換行問題

    這篇文章主要介紹了Vue 解決在element中使用$notify在提示信息中換行問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue事件中如何獲取原事件參數(shù)

    Vue事件中如何獲取原事件參數(shù)

    文章介紹了如何在Vue中通過Click方法獲取原事件的參數(shù),包括默認參數(shù)、自定義參數(shù)以及如何同時獲取原生事件和自定義參數(shù)的方法
    2024-12-12

最新評論

万荣县| 吉木乃县| 怀集县| 望都县| 克拉玛依市| 阳春市| 延津县| 新宾| 浠水县| 东乌珠穆沁旗| 莱芜市| 河北省| 治县。| 天峨县| 峨边| 平湖市| 承德市| 扎鲁特旗| 星子县| 吴旗县| 德清县| 廉江市| 邛崃市| 宁强县| 革吉县| 宣武区| 柳河县| 邵武市| 分宜县| 辛集市| 乃东县| 临潭县| 景宁| 巫溪县| 鹰潭市| 北宁市| 琼中| 宜宾县| 铜梁县| 富阳市| 新乡县|