RN EventBus實現(xiàn)跨組件間通信

寫在前面

雖然有一定的移動APP開發(fā)經(jīng)驗刻两,但RN技術我還是一個小白外恕,上一篇對路由等有了一定的了解,這篇文章將著重解決RN跨組件進行通信的方式学少。實現(xiàn)的效果是剪个,A界面跳轉(zhuǎn)B界面,B界面進行狀態(tài)的修改版确,然后A界面做出相應的數(shù)值變化扣囊。

效果展示

// 進入界面A
監(jiān)聽界面:componentWillMount
進行監(jiān)聽
// 進入界面B并發(fā)布消息
界面監(jiān)聽回傳值 傳遞數(shù)值
// 退出界面A
監(jiān)聽界面:componentWillUnmount
取消監(jiān)聽

ok就是如上日志的效果,生命周期開始注冊阀坏,然后結(jié)束的時候取消監(jiān)聽即可

EventBus源碼

class EventBus {
    constructor() {
        this.events = this.events || {};
    }
}

//構(gòu)造函數(shù)需要存儲event事件
//發(fā)布事件如暖,參數(shù)是事件的type和需要傳遞的參數(shù)
EventBus.prototype.emit = function (type, ...args) {
    let e;
    e = this.events[type];
    // 查看這個type的event有多少個回調(diào)函數(shù),如果有多個需要依次調(diào)用忌堂。
    if (Array.isArray(e)) {
        for (let i = 0; i < e.length; i++) {
            e[i].apply(this, args);
        }
    } else {
        e.apply(this, args);
    }
};

//監(jiān)聽函數(shù),參數(shù)是事件type和觸發(fā)時需要執(zhí)行的回調(diào)函數(shù)
EventBus.prototype.addListener = function (type, fun) {
    const e = this.events[type];
    let currentIndex = -1
    if (!e) {   //如果從未注冊過監(jiān)聽函數(shù)酗洒,則將函數(shù)放入數(shù)組存入對應的鍵名下
        this.events[type] = [fun];
        currentIndex = 0
    } else {  //如果注冊過士修,則直接放入
        e.push(fun);
        //獲取當前組件監(jiān)聽函數(shù),在觀察函數(shù)數(shù)組中的索引樱衷,移除監(jiān)聽時使用
        currentIndex = this.events[type].length - 1
    }
    return { type, index: currentIndex}
};


//移除監(jiān)聽
EventBus.prototype.remove = function (subscribe) {
    let { type, index } = subscribe
    let e;
    e = this.events[type];
    // 查看這個type的event有多少個回調(diào)函數(shù)棋嘲,如果有多個需要依次調(diào)用。
    if (Array.isArray(e)) {
        //監(jiān)聽的函數(shù)為空矩桂,則空處理
        if (e.length === 0) {
            return
        } else if (e.length === 1) {
            //只有一個監(jiān)聽的函數(shù)沸移,則直接移除監(jiān)聽
            e.splice(0, 1)
        } else {
            //如果同一個key存在多個監(jiān)聽函數(shù),只移除當前組件監(jiān)聽函數(shù)
            for (let i = 0; i < e.length; i++) {
                if (index > 0 && i === index) {
                    e.splice(index, 1)
                }
            }
        }
    } else {
        e = []
    }
};

//移除所有監(jiān)聽
EventBus.prototype.removeAll = function () {
    //移除所有監(jiān)聽函數(shù)
    if (this.events.length > 0) {
        this.events.length = 0;
    }
};

const eventBus = new EventBus();
export default eventBus;

具體代碼使用

PageA 進行注冊

               // 監(jiān)聽并設置狀態(tài)改變剛更新UI 
        componentWillMount(): void {
            console.log('監(jiān)聽界面:componentWillMount');
            console.log('進行監(jiān)聽');
            this.subscribe = EventBus.addListener("notify", data => {
                console.log("界面監(jiān)聽回傳值", data);
                this.setState({
                    show:data
                })
            });
        }
                // 取消監(jiān)聽以放置重復注冊
        componentWillUnmount(): void {
            console.log('監(jiān)聽界面:componentWillUnmount');
            console.log('取消監(jiān)聽');
            EventBus.remove(this.subscribe);
        }

PageB觸發(fā)

EventBus.emit('notify','傳遞數(shù)值');

好了如上就是全部的使用了

拓展

由于受了Android開發(fā)的影響侄榴,始終對EventBus情有獨鐘雹锣,應用vue也是如此,但我們也需要對其基本的父子組件通信的學習以及了解癞蚕,如props等父子通信是要會的蕊爵。這是我們通信學習的第一步,后面還需要對redux進行深入的學習桦山。既然開始了攒射,就一定要百分百的付出。

參考文章

React組件通信——Event Bus
React Native Event Bus,消息總線
React Native組件生命周期

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恒水,一起剝皮案震驚了整個濱河市会放,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钉凌,老刑警劉巖咧最,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡窗市,警方通過查閱死者的電腦和手機先慷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咨察,“玉大人论熙,你說我怎么就攤上這事∩阌” “怎么了脓诡?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長媒役。 經(jīng)常有香客問我祝谚,道長,這世上最難降的妖魔是什么酣衷? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任交惯,我火速辦了婚禮,結(jié)果婚禮上穿仪,老公的妹妹穿的比我還像新娘席爽。我一直安慰自己,他們只是感情好啊片,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布只锻。 她就那樣靜靜地躺著,像睡著了一般紫谷。 火紅的嫁衣襯著肌膚如雪齐饮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天笤昨,我揣著相機與錄音祖驱,去河邊找鬼。 笑死咬腋,一個胖子當著我的面吹牛羹膳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播根竿,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陵像,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寇壳?” 一聲冷哼從身側(cè)響起醒颖,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壳炎,沒想到半個月后泞歉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逼侦,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年腰耙,在試婚紗的時候發(fā)現(xiàn)自己被綠了榛丢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡挺庞,死狀恐怖晰赞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情选侨,我是刑警寧澤掖鱼,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站援制,受9級特大地震影響戏挡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晨仑,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一褐墅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洪己,春花似錦掌栅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澄耍。三九已至噪珊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間齐莲,已是汗流浹背痢站。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留选酗,地道東北人阵难。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像芒填,于是被迫代替她去往敵國和親呜叫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354