国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

探索前端跨組件通信:EventBus在Vue和React中的應(yīng)用

這篇具有很好參考價(jià)值的文章主要介紹了探索前端跨組件通信:EventBus在Vue和React中的應(yīng)用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本文作者系360奇舞團(tuán)前端開發(fā)工程師

EventBus 簡(jiǎn)介

事件總線(Event Bus)是一種用于組件間通信的模式,通常用于解決組件之間的解耦和簡(jiǎn)化通信的問題。在前端框架中,如 Vue.js,事件總線是一個(gè)常見的概念?;旧?,事件總線是一個(gè)能夠觸發(fā)和監(jiān)聽事件的機(jī)制,使得組件能夠在不直接依賴彼此的情況下進(jìn)行通信。事件總線可以是一個(gè)全局的單例對(duì)象,也可以是一個(gè)基于發(fā)布-訂閱模式的實(shí)現(xiàn)。

設(shè)計(jì)模式

在軟件架構(gòu)中,發(fā)布/訂閱Publish–subscribe pattern)是一種消息范式,消息的發(fā)送者(稱為發(fā)布者)不會(huì)將消息直接發(fā)送給特定的接收者(稱為訂閱者),而是將發(fā)布的消息分為不同的類別,無需了解哪些訂閱者(如果存在)。同樣,訂閱者可以表達(dá)對(duì)一個(gè)或多個(gè)類別的興趣,只接收感興趣的消息,無需了解哪些發(fā)布者(如果存在)。探索前端跨組件通信:EventBus在Vue和React中的應(yīng)用,前端,vue.js,react.js,javascript,ecmascript

訂閱-發(fā)布模式(Publish-Subscribe Pattern)是一種軟件設(shè)計(jì)模式,也屬于行為型模式之一。它定義了一種對(duì)象間一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),所有依賴于它的對(duì)象都會(huì)得到通知并自動(dòng)更新。這種模式降低了對(duì)象之間的直接耦合,使得系統(tǒng)更加靈活。該模式包含兩個(gè)主要角色:

  1. 發(fā)布者(Publisher): 負(fù)責(zé)發(fā)布(廣播)消息或事件的對(duì)象。當(dāng)發(fā)布者的狀態(tài)發(fā)生變化時(shí),它會(huì)通知所有已訂閱的對(duì)象。

  2. 訂閱者(Subscriber): 訂閱發(fā)布者的消息或事件的對(duì)象。訂閱者通過注冊(cè)自己的回調(diào)函數(shù)(或觀察者)來接收發(fā)布者的通知。

具體實(shí)現(xiàn)步驟如下:

  • 發(fā)布者維護(hù)一個(gè)訂閱者列表(數(shù)組),用于存儲(chǔ)所有訂閱了它的對(duì)象。

  • 訂閱者向發(fā)布者注冊(cè)自己的回調(diào)函數(shù)(或觀察者)。

  • 當(dāng)發(fā)布者的狀態(tài)發(fā)生變化時(shí),它會(huì)遍歷訂閱者列表,調(diào)用每個(gè)訂閱者的回調(diào)函數(shù),通知它們狀態(tài)的變化。

探索前端跨組件通信:EventBus在Vue和React中的應(yīng)用,前端,vue.js,react.js,javascript,ecmascript
image.png

EventBus 在前端(Vue 中)的使用

  1. 創(chuàng)建事件總線:

javascriptCopy?code
//?event-bus.js

import?Vue?from?'vue';

//?創(chuàng)建一個(gè)新的Vue實(shí)例作為事件總線
const?EventBus?=?new?Vue();

//?導(dǎo)出該實(shí)例,以便在應(yīng)用程序中的其他地方使用
export?default?EventBus;
  1. 組件 A:

<!--?ComponentA.vue?-->

??<template>
????<div>
??????<button?@click="emitEvent">觸發(fā)事件</button>
??</div>
??</template>

??<script>
??import?EventBus?from?'./event-bus.js';

export?default?{
??methods:?{
????emitEvent()?{
??????//?使用事件總線觸發(fā)名為?'custom-event'?的事件,并傳遞數(shù)據(jù)
??????EventBus.$emit('custom-event',?'這是傳遞的數(shù)據(jù)');
????}
??}
}
??</script>
  1. 組件 B:

<!--?ComponentB.vue?-->

??<template>
????<div>
??????<p>{{?eventData?}}</p>
????</div>
??</template>

??<script>
??import?EventBus?from?'./event-bus.js';

export?default?{
??data()?{
????return?{
??????eventData:?''
????};
??},
??mounted()?{
????//?在組件創(chuàng)建時(shí),通過事件總線監(jiān)聽?'custom-event'?事件
????EventBus.$on('custom-event',?eventData?=>?{
??????//?更新組件的數(shù)據(jù)
??????this.eventData?=?eventData;
??????console.log('收到事件,數(shù)據(jù)為:',?eventData);
????});
??}
}
??</script>

ComponentA組件通過點(diǎn)擊按鈕觸發(fā)了一個(gè)名為 custom-event 的事件,并傳遞了一些數(shù)據(jù)。ComponentB組件在創(chuàng)建時(shí)通過事件總線監(jiān)聽了這個(gè)事件,并在事件發(fā)生時(shí)更新了組件的數(shù)據(jù)。注意:使用事件總線時(shí)需要注意組件的生命周期,確保在不再需要監(jiān)聽事件的組件被銷毀時(shí)取消事件監(jiān)聽,以避免潛在的內(nèi)存泄漏

  1. 銷毀

beforeDestroy()?{
????//?在組件銷毀前取消事件監(jiān)聽
????EventBus.$off('custom-event',?this.eventBusListener);
??}

EventBus 在前端(React 中)的使用

在 React 中,沒有像 Vue 中的事件總線那樣的直接內(nèi)置機(jī)制。React 通常使用 props 和回調(diào)函數(shù)來實(shí)現(xiàn)組件之間的通信。然而,如果你的應(yīng)用需要在不適用 props 傳遞的情況下進(jìn)行全局事件的訂閱和發(fā)布,可以使用第三方庫,比如 eventemitter3 或者 Redux。以下是使用 Event Emitter 的一個(gè)簡(jiǎn)單示例:

  1. 安裝 eventemitter3

npm?install?eventemitter3
  1. 創(chuàng)建全局的事件管理器

//?eventBus.js

import?{?EventEmitter?}?from?'eventemitter3';

const?eventBus?=?new?EventEmitter();

export?default?eventBus;
  1. 引入這個(gè)事件總線訂閱和發(fā)布事件:

//?ComponentA.jsx

import?React?from?'react';
import?eventBus?from?'./eventBus';

class?ComponentA?extends?React.Component?{
??emitEvent?=?()?=>?{
????eventBus.emit('custom-event',?'這是傳遞的數(shù)據(jù)');
??};

??render()?{
????return?(
??????<div>
????????<button?onClick={this.emitEvent}>觸發(fā)事件</button>
??????</div>
????);
??}
}

export?default?ComponentA;
//?ComponentB.jsx

import?React,?{?useState,?useEffect?}?from?'react';
import?eventBus?from?'./eventBus';

const?ComponentB?=?()?=>?{
??const?[eventData,?setEventData]?=?useState('');

??useEffect(()?=>?{
????const?eventBusListener?=?(data)?=>?{
??????setEventData(data);
??????console.log('收到事件,數(shù)據(jù)為:',?data);
????};

????eventBus.on('custom-event',?eventBusListener);

????return?()?=>?{
??????//?在組件卸載時(shí)取消事件監(jiān)聽
??????eventBus.off('custom-event',?eventBusListener);
????};
??},?[]);

??return?(
????<div>
??????<p>{eventData}</p>
????</div>
??);
};

export?default?ComponentB;
  1. 注意:在組件卸載**eventBus.off('custom-event', eventBusListener);**時(shí)取消事件監(jiān)聽以避免潛在的內(nèi)存泄漏。

使用 EventBus 優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  1. 解耦組件: 事件總線能夠?qū)崿F(xiàn)組件之間的解耦,使得它們不需要直接引用或依賴彼此,提高了代碼的靈活性和可維護(hù)性。

  2. 簡(jiǎn)化通信: 對(duì)于一些簡(jiǎn)單的通信需求,事件總線提供了一種相對(duì)簡(jiǎn)單的方式,避免了通過 props 和回調(diào)函數(shù)傳遞數(shù)據(jù)時(shí)的繁瑣操作。

  3. 全局通信: 事件總線通常是全局性的,能夠在整個(gè)應(yīng)用程序中的任何地方進(jìn)行通信,適用于全局狀態(tài)的傳遞和應(yīng)用的整體控制。

  4. 跨組件通信: 事件總線可以方便地實(shí)現(xiàn)非父子組件之間的通信,而不需要在組件之間建立直接的關(guān)聯(lián)。

缺點(diǎn):

  1. 全局狀態(tài)管理: 使用事件總線可能引入全局狀態(tài),導(dǎo)致應(yīng)用狀態(tài)變得難以追蹤和理解,特別是在大型應(yīng)用中。

  2. 難以調(diào)試: 全局性的事件監(jiān)聽和觸發(fā)可能使得追蹤代碼執(zhí)行流程和調(diào)試變得更加困難,尤其是在復(fù)雜的應(yīng)用場(chǎng)景下。

  3. 潛在的性能問題: 大量的全局事件監(jiān)聽和觸發(fā)可能導(dǎo)致性能問題,尤其是在頻繁觸發(fā)事件的情況下。

  4. 不明確的數(shù)據(jù)流向: 使用事件總線時(shí),數(shù)據(jù)的流向相對(duì)不明確,可能增加代碼的復(fù)雜性,使得應(yīng)用程序的數(shù)據(jù)流變得更加難以理解。

  5. 安全性問題: 由于事件總線是全局的,可能存在安全風(fēng)險(xiǎn),例如某個(gè)組件監(jiān)聽了不應(yīng)該被其它組件觸發(fā)的敏感事件。

總結(jié)

綜合考慮,對(duì)于小型應(yīng)用或簡(jiǎn)單的場(chǎng)景,事件總線是一個(gè)方便的工具。但在大型應(yīng)用或需要更嚴(yán)格狀態(tài)管理和調(diào)試的情況下,可能需要考慮使用更復(fù)雜的狀態(tài)管理工具,如 Vuex 或 Redux。使用事件總線時(shí),需要謹(jǐn)慎使用,避免濫用全局狀態(tài)和事件。

-?END?-

關(guān)于奇舞團(tuán)

奇舞團(tuán)是 360 集團(tuán)最大的大前端團(tuán)隊(duì),代表集團(tuán)參與 W3C 和 ECMA 會(huì)員(TC39)工作。奇舞團(tuán)非常重視人才培養(yǎng),有工程師、講師、翻譯官、業(yè)務(wù)接口人、團(tuán)隊(duì) Leader 等多種發(fā)展方向供員工選擇,并輔以提供相應(yīng)的技術(shù)力、專業(yè)力、通用力、領(lǐng)導(dǎo)力等培訓(xùn)課程。奇舞團(tuán)以開放和求賢的心態(tài)歡迎各種優(yōu)秀人才關(guān)注和加入奇舞團(tuán)。

探索前端跨組件通信:EventBus在Vue和React中的應(yīng)用,前端,vue.js,react.js,javascript,ecmascript文章來源地址http://www.zghlxwxcb.cn/news/detail-787269.html

到了這里,關(guān)于探索前端跨組件通信:EventBus在Vue和React中的應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue3探索——組件通信之依賴注入

    vue3探索——組件通信之依賴注入

    通常情況下,當(dāng)我們需要從父組件向子組件傳遞數(shù)據(jù)時(shí),會(huì)使用? props 。想象一下這樣的結(jié)構(gòu):有一些多層級(jí)嵌套的組件,形成了一顆巨大的組件樹,而某個(gè)深層的子組件需要一個(gè)較遠(yuǎn)的祖先組件中的部分?jǐn)?shù)據(jù)。在這種情況下,如果僅使用 props 則必須將其沿著組件鏈逐級(jí)傳遞

    2024年02月10日
    瀏覽(18)
  • vue3探索——組件通信之事件總線

    Vue2.x使用EventBus進(jìn)行組件通信,而Vue3.x推薦使用 mitt.js 。 比起Vue實(shí)例上的 EventBus , mitt.js 好在哪里呢?首先它足夠小,僅有200bytes,其次支持全部事件的監(jiān)聽和批量移除,它還不依賴Vue實(shí)例,所以可以跨框架使用,React或者Vue,甚至jQuery項(xiàng)目都能使用同一套庫。 使用yarn安裝

    2024年02月12日
    瀏覽(19)
  • 前端react入門day02-React中的事件綁定與組件

    前端react入門day02-React中的事件綁定與組件

    (創(chuàng)作不易,感謝有你,你的支持,就是我前行的最大動(dòng)力,如果看完對(duì)你有幫助,請(qǐng)留下您的足跡) 目錄 React中的事件綁定 React 基礎(chǔ)事件綁定 使用事件對(duì)象參數(shù)? 傳遞自定義參數(shù)? 同時(shí)傳遞事件對(duì)象和自定義參數(shù)? React中的組件? 組件是什么 React組件 useState? 修改狀態(tài)的規(guī)

    2024年02月06日
    瀏覽(24)
  • vue3探索——組件通信之v-model父子組件數(shù)據(jù)同步

    再很多場(chǎng)景中,我們可能想在子組件中修改父組件的數(shù)據(jù),但事實(shí)上,vue不推薦我們這么做,因?yàn)閿?shù)據(jù)的修改不容易溯源。 在vue2中,我們使用 .sync 修飾符+自定義事件 \\\'update:xxx\\\' ,來使父子組件數(shù)據(jù)同步。 這里不作過多說明,有需要請(qǐng)自行了解。 vue3的寫法與vue2基本一致。最

    2024年02月11日
    瀏覽(22)
  • vue3探索——使用ref與$parent實(shí)現(xiàn)父子組件間通信

    在vue3中,可以使用vue3的API defineExpose() 函數(shù)結(jié)合 ref 或者 $parent ,實(shí)現(xiàn)父子組件數(shù)據(jù)的傳遞。 子組件:通過 defineExpose() 函數(shù),向外暴露響應(yīng)式數(shù)據(jù)或者方法 父組件:通過 ref 獲取子組件實(shí)例,進(jìn)而獲取子組件暴露的響應(yīng)式數(shù)據(jù)或方法 ?? 你沒看錯(cuò)!這里的 ref 就是經(jīng)常用來定

    2024年02月10日
    瀏覽(25)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(三十四)——組件中的異步操作及優(yōu)化

    【前端知識(shí)】React 基礎(chǔ)鞏固(三十四)——組件中的異步操作及優(yōu)化

    通過組件的生命周期來完成網(wǎng)絡(luò)請(qǐng)求,網(wǎng)絡(luò)請(qǐng)求的異步代碼直接放在組件中 通過redux來管理異步網(wǎng)絡(luò)請(qǐng)求 在store中引入中間件 redux-thunk 構(gòu)建 fetchHomeMultidataAction ,將原本在組件中的異步請(qǐng)求代碼放入到actionCreators.js中 改寫原來的category.jsx,派發(fā)異步請(qǐng)求的dispatch 查看運(yùn)行結(jié)果

    2024年02月15日
    瀏覽(38)
  • 前端Vue入門-day04-用vue實(shí)現(xiàn)組件通信

    前端Vue入門-day04-用vue實(shí)現(xiàn)組件通信

    (創(chuàng)作不易,感謝有你,你的支持,就是我前行的最大動(dòng)力,如果看完對(duì)你有幫助,請(qǐng)留下您的足跡) 目錄 組件的三大組成部分 注意點(diǎn)說明 組件的樣式?jīng)_突 scoped data 是一個(gè)函數(shù) 組件通信 什么是組件通信 不同的組件關(guān)系 和 組件通信方案分類 ? 父子通信流程圖:? 父 → 子

    2024年02月15日
    瀏覽(21)
  • Web前端 ---- 【Vue】(組件)父子組件之間的通信一文帶你了解

    Web前端 ---- 【Vue】(組件)父子組件之間的通信一文帶你了解

    目錄 前言 父組件傳子組件 ---- props 給要傳遞數(shù)據(jù)的子組件綁定要傳過去的屬性及屬性值 在子組件中使用props配置項(xiàng)接收 props配置項(xiàng) 子組件傳父組件 ---- 組件的自定義事件 子組件向父組件傳遞數(shù)據(jù) 通過代碼來綁定自定義事件 本文將介紹在Vue中父子組件如何進(jìn)行通信 這里先介

    2024年02月05日
    瀏覽(631)
  • Vue組件通信原理及應(yīng)用場(chǎng)景解析

    Vue組件通信原理及應(yīng)用場(chǎng)景解析

    ???? 博主 libin9iOak帶您 Go to New World.??? ?? 個(gè)人主頁——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動(dòng)形象??簡(jiǎn)單易學(xué)!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍》學(xué)會(huì)IDEA常用操作,工作效率翻倍~?? ???? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬

    2024年02月15日
    瀏覽(23)
  • 微前端使用qiankun實(shí)現(xiàn),react主應(yīng)用同時(shí)兼顧react,vue3,umi子應(yīng)用

    微前端使用qiankun實(shí)現(xiàn),react主應(yīng)用同時(shí)兼顧react,vue3,umi子應(yīng)用

    理解 :我們可以簡(jiǎn)單理解為微前端是將一個(gè)項(xiàng)目拆分成多個(gè)模塊,每個(gè)微前端模塊可以由不同的團(tuán)隊(duì)進(jìn)行管理,并可以自主選擇框架,并且有自己的倉庫,可以獨(dú)立部署上線 應(yīng)用場(chǎng)景 :1.當(dāng)公司代碼較老需要使用新的技術(shù)棧時(shí)我們可以使用微前端。2.多個(gè)團(tuán)隊(duì)同時(shí)開發(fā)時(shí),每

    2024年02月09日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包