亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue3中事件總線的具體使用

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

導(dǎo)讀

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

事件總線的本質(zhì)

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

構(gòu)建一個(gè)EventEmitter

由于我們可能會(huì)有多條總線,我們還是把EventEmitter寫成類的方式,每一條總線都將是一個(gè)EventEmitter實(shí)例。以下是EventEmitter的簡(jiǎn)單實(shí)現(xiàn),其只實(shí)現(xiàn)了on、onceemit三個(gè)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);
    }
}

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

將EventEmitter實(shí)例化并全局引入

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

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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3.0翻牌數(shù)字組件使用方法詳解

    vue3.0翻牌數(shù)字組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了vue3.0翻牌數(shù)字組件使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue 限制input只能輸入正數(shù)的操作

    vue 限制input只能輸入正數(shù)的操作

    這篇文章主要介紹了vue 限制input只能輸入正數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vueCli4如何配置vue.config.js文件

    vueCli4如何配置vue.config.js文件

    這篇文章主要介紹了vueCli4如何配置vue.config.js文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • vue+Element中table表格實(shí)現(xiàn)可編輯(select下拉框)

    vue+Element中table表格實(shí)現(xiàn)可編輯(select下拉框)

    這篇文章主要介紹了vue+Element中table表格實(shí)現(xiàn)可編輯,實(shí)現(xiàn)select下拉框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • vue-router2.0 組件之間傳參及獲取動(dòng)態(tài)參數(shù)的方法

    vue-router2.0 組件之間傳參及獲取動(dòng)態(tài)參數(shù)的方法

    下面小編就為大家?guī)硪黄獀ue-router2.0 組件之間傳參及獲取動(dòng)態(tài)參數(shù)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • 淺析vue3響應(yīng)式數(shù)據(jù)與watch屬性

    淺析vue3響應(yīng)式數(shù)據(jù)與watch屬性

    這篇文章主要介紹了vue3響應(yīng)式數(shù)據(jù)與watch屬性的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 使用vue實(shí)現(xiàn)一個(gè)電子簽名組件的示例代碼

    使用vue實(shí)現(xiàn)一個(gè)電子簽名組件的示例代碼

    這篇文章主要介紹了使用vue實(shí)現(xiàn)一個(gè)電子簽名組件的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • vue.js 實(shí)現(xiàn)評(píng)價(jià)五角星組件的實(shí)例代碼

    vue.js 實(shí)現(xiàn)評(píng)價(jià)五角星組件的實(shí)例代碼

    這篇文章主要介紹了vue.js 實(shí)現(xiàn)評(píng)價(jià)五角星組件的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • 使用VUE+iView+.Net Core上傳圖片的方法示例

    使用VUE+iView+.Net Core上傳圖片的方法示例

    這篇文章主要介紹了使用VUE+iView+.Net Core上傳圖片的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • Vue組件與Vue cli腳手架安裝方法超詳細(xì)講解

    Vue組件與Vue cli腳手架安裝方法超詳細(xì)講解

    CLI是一個(gè)全局安裝的npm包,提供了終端里的vue命令。它可以通過vue create快速搭建一個(gè)新項(xiàng)目,或者直接通過vue serve構(gòu)建新想法的原型。你也可以通過vue ui通過一套圖形化界面管理你的所有項(xiàng)目
    2022-11-11

最新評(píng)論