react-native 發(fā)布/訂閱事件總線EventBus 使用

前言

學(xué)過Android的同學(xué)應(yīng)該都用過的一個(gè)框架->EventBus. 在我們需要的地方設(shè)置一個(gè)監(jiān)聽,在另外一段代碼中,我們只要發(fā)送一個(gè)Event,則監(jiān)聽中的代碼就會(huì)立即執(zhí)行. 能很大程度上解耦代碼.

我們都知道 react-native 是依賴于Node.js的,而在node.js 中,剛好有一個(gè)與EventBus 類似的機(jī)制 Events.

使用場(chǎng)景

在講如何使用之前,我們先來看一下,Event 對(duì)我們有什么幫助,我們?yōu)槭裁葱枰褂盟?

場(chǎng)景一

該頁面顯示的內(nèi)容都是用戶所訂閱的主播,然后旁邊與一個(gè)"已訂閱"按鈕,如果點(diǎn)擊,則按鈕變成"訂閱",注意 頭部 "我的訂閱( counter )" 這里面的數(shù)字是會(huì)變動(dòng)的.

常規(guī)處理可能是這樣的,該頁面肯定是包含多個(gè) 組件Component 組成,但 組件Component之間又沒有直接關(guān)聯(lián),所以 我們只能用回調(diào)處理,一層層將事件發(fā)送到 頂級(jí)組件中,然后又分發(fā)出去.

使用 Events 后就簡單多了,我們可以在頭部Component 中注冊(cè)監(jiān)聽,然后在 ListView的Item中發(fā)送Event事件即可實(shí)現(xiàn)需求.

場(chǎng)景二

用戶登錄前后頁面狀態(tài)的更改.

安裝使用

安裝

將命令行移動(dòng)到項(xiàng)目的根目錄,執(zhí)行以下: npm install events --save

使用示例

  1. 新建CountEmitter.js 文件
'use strict';

const EventEmitter = require('events');

class CountEmitter extends EventEmitter{

}
const SingleCountEmitter = new CountEmitter();
export default SingleCountEmitter;

  1. 新建 TopPage.js 文件
'use strict';
import React from 'react';
import {
    View,
    Text
} from 'react-native';

import CounterEmitter from './CountEmitter';

class TopPage extends React.Component{

    // 構(gòu)造
      constructor(props) {
        super(props);
        // 初始狀態(tài)
        this.state = {
            count:0
        };
      }

    componentWillMount() {
        CounterEmitter.addListener('addCounter',()=>{
            let newCount=this.state.count+1;
            this.setState({
                count:newCount
            });
        });
        CounterEmitter.addListener('reduceCounter',()=>{
            let newCount=this.state.count-1;
            this.setState({
                count:newCount
            });
        });
    }

    render(){
        return (
            <View style={{flex:1,justifyContent:'center',alignItems:'center'}}>
                <Text>Count: {this.state.count}</Text>
            </View>
        );
    }
}

export default TopPage;
  1. 新建BottomPage.js 文件
'use strict';
import React from 'react';
import {
    View,
    Text,
    TouchableOpacity
} from 'react-native';

import CounterEmitter from './CountEmitter';

class BottomPage extends React.Component{

    render(){
        return (
            <View style={{flex:1}}>
              <TouchableOpacity
                  onPress={()=>{
                  CounterEmitter.emit('addCounter');
              }}>
                  <View style={{width:100,height:100,borderRadius:10,backgroundColor:'red',justifyContent:'center',alignItems:'center'}}>
                      <Text style={{color:'white',fontSize:18}}>Add</Text>
                  </View>
              </TouchableOpacity>

              <TouchableOpacity
                  style={{marginTop:40}}
                    onPress={()=>{
                        CounterEmitter.emit('reduceCounter');
                    }}>
                    <View style={{width:100,height:100,borderRadius:10,backgroundColor:'green',justifyContent:'center',alignItems:'center'}}>
                        <Text style={{color:'white',fontSize:18}}>Reduce</Text>
                    </View>
                </TouchableOpacity>
            </View>
        );
    }
}

export default BottomPage;
  1. 修改index.android.js
import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  View
} from 'react-native';

import TopPage from './TopPage';
import BottomPage from './BottomPage';


class AwesomeProject extends Component {
  
  render() {
    return (
      <View style={styles.container}>
        <TopPage/>
        <View style={{height:1,backgroundColor:'gray',width:500,marginBottom:50}} />
        <BottomPage/>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  }
});

AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);

最終效果

效果: 在BottomPage 中點(diǎn)擊 Add或Reduce 按鈕能使 TopPage 的數(shù)字發(fā)生改變.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末曙强,一起剝皮案震驚了整個(gè)濱河市涝登,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異威鹿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)轨香,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門忽你,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人臂容,你說我怎么就攤上這事科雳「罚” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵炸渡,是天一觀的道長娜亿。 經(jīng)常有香客問我,道長蚌堵,這世上最難降的妖魔是什么买决? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮吼畏,結(jié)果婚禮上督赤,老公的妹妹穿的比我還像新娘。我一直安慰自己泻蚊,他們只是感情好躲舌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著性雄,像睡著了一般没卸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秒旋,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天约计,我揣著相機(jī)與錄音,去河邊找鬼迁筛。 笑死煤蚌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的细卧。 我是一名探鬼主播尉桩,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贪庙!你這毒婦竟也來了蜘犁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤止邮,失蹤者是張志新(化名)和其女友劉穎这橙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體农尖,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼贸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年消返,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旬陡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片映胁。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舶替,死狀恐怖说墨,靈堂內(nèi)的尸體忽然破棺而出俩滥,到底是詐尸還是另有隱情躬它,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布滓技,位于F島的核電站哩牍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏令漂。R本人自食惡果不足惜膝昆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叠必。 院中可真熱鬧荚孵,春花似錦、人聲如沸纬朝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽共苛。三九已至判没,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隅茎,已是汗流浹背澄峰。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留患膛,地道東北人摊阀。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像踪蹬,于是被迫代替她去往敵國和親胞此。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評(píng)論 25 707
  • 項(xiàng)目到了一定階段會(huì)出現(xiàn)一種甜蜜的負(fù)擔(dān):業(yè)務(wù)的不斷發(fā)展與人員的流動(dòng)性越來越大跃捣,代碼維護(hù)與測(cè)試回歸流程越來越繁瑣漱牵。這個(gè)...
    fdacc6a1e764閱讀 3,174評(píng)論 0 6
  • 一、概述 EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線疚漆。主要功能是替代Intent,Handl...
    AiPuff閱讀 1,271評(píng)論 2 0
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容酣胀,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,046評(píng)論 0 29
  • 漫漫國慶長假娶聘,有些人在路上旅游觀光,有些人在家追劇葛優(yōu)躺闻镶,每個(gè)人都在過著自己喜歡的不喜歡的生活。有秀恩愛的...
    逆流的魚dj閱讀 362評(píng)論 0 1