React Native Flux框架的使用

React Native Flux框架的使用

Flux是RN比較常用的框架,用起來相對比較簡單和方便侮邀。Flux實現(xiàn)的原理不再說明。這里只做Flux在項目中的具體使用。

使用Flux首先需要安裝Flux包

npm install flux

創(chuàng)建flux文件

  • 創(chuàng)建dispatcher.js -> dispatcher
var Dispatcher = require('flux').Dispatcher;
module.exports = new Dispatcher();
  • 聲明type常量 AppConstants.js
npm install keymirror

keymirror: 在 Closure Compiler 的高級模式下搀缠,Object 的 key 會被壓縮替換成更短的字符,這樣就不能創(chuàng)建一個 key 跟 value 相等的 Object 了近迁。keyMirror 就是解決這個問題的艺普。

import keyMirror from 'keymirror';  [^keymirror]
let AppConstants = keyMirror({
    ADD_NUMBER: null,
    GET_NUMBER: null,
});
    
export default AppConstants;
  • 創(chuàng)建AppActions.js -> action
import AppDispatcher from '../dispatcher/AppDispatcher';
import AppConstants from '../constants/AppConstants';

let AppActions = {

    addNumberAction(num) {
        // 加上num 
        AppDispatcher.dispatch({
            actionType: AppConstants.ADD_NUMBER,
            num: num
        });
    },
    getNumberAction(){
        //獲取最新的數(shù)組
        AppDispatcher.dispatch({
            actionType:AppConstants.GET_NUMBER,
        })
    }
};

export default AppActions;
  • 創(chuàng)建AppStore -> store
import {EventEmitter} from 'events';
import assign from 'object-assign';
import AppDispatcher from '../dispatcher/AppDispatcher';
import AppConstants  from '../constants/AppConstants';
let CHANGE_EVENT = 'change';

const AppStore = assign({}, EventEmitter.prototype, {

    num: 100, //初始化

    addNumber: function(number) {
        this.num += number;
        // alert(this.num);

        return this.num;
    },
    getNumber: function() {

        return this.num;

    },
    emitChange: function() {

        this.emit(CHANGE_EVENT);
    },

    addChangeListener: function(callback) {
        this.on(CHANGE_EVENT, callback);
    },

    removeChangeListener: function(callback) {
        this.removeListener(CHANGE_EVENT, callback);
    }

})

// Register callback to handle all updates
AppDispatcher.register((action) =>{

    switch(action.actionType) {

        case AppConstants.ADD_NUMBER:
            // _getStateMessage(action.num);
            AppStore.addNumber(action.num);
            AppStore.emitChange()

            //alert(action.num);
            break;
        case AppConstants.GET_NUMBER:
            AppStore.getNumber();
            AppStore.emitChange()
            break;

        case AppConstants.SET_MESSAGE:
            AppStore.emitChange();
            break;

        default:
    }

});
export default AppStore;

在項目中使用

此項目實現(xiàn)效果為A頁面數(shù)字 Push到 B 頁面 B頁面對數(shù)字進行添加 pop回A頁面 A頁面數(shù)字改變

A.js

import React, { Component } from 'react'
import {
    Navigator,
    Text,
    View,
    AsyncStorage,
    TouchableHighlight
} from 'react-native'
import SecondPage from './SecondPage'
import AppStore from './stores/AppStore'
// import AppActions from './actions/AppActions'
export default class HomePage extends Component
{
    constructor(props) {
        super(props);
        this.state = {
            number:100
        }
    }
    componentDidMount() {
        AppStore.addChangeListener(this._onChange.bind(this));
    }

    componentWillUnmount() {
        AppStore.removeChangeListener(this._onChange.bind(this));
    }
    _onChange() {
        this.setState({
            number: AppStore.getNumber()
        });
    }
    render(){
        return (
            <View style={{flex:1,justifyContent:'center',alignItems: 'center'}}>
                <Text style={{padding:50}}>{this.state.number}</Text>
                <TouchableHighlight onPress={()=>{
                    const navigator = this.props.navigator
                    if (navigator) {
                        navigator.push(
                            {
                                name:'SecondPage',
                                component:SecondPage,
                                params:{
                                    getRegionSelectText:(text)=>{
                                        this.setState({regionSelect:text})
                                    }
                                }
                            }
                        )
                    }

                }}>
                    <Text>下一個頁面</Text>
                </TouchableHighlight>

            </View>
        )
    }
}

B.js

import React, { Component } from 'react'
import {
    Navigator,
    Text,
    View,
    AsyncStorage,
    TouchableHighlight
} from 'react-native'
import AppStore from './stores/AppStore'
import AppActions from './actions/AppActions'
export default class SecondPage extends Component
{
    constructor(props) {
        super(props);
        this.state = {
            number:AppActions.getNumberAction()

        }
    }
    componentDidMount() {
        AppStore.addChangeListener(this._onChange.bind(this));
    }
    componentWillUnmount() {
        AppStore.removeChangeListener(this._onChange.bind(this));
    }
    _onChange() {
        this.setState({
            number: AppStore.getNumber()
        });
    }
    render(){
        return (
            <View style={{flex:1,justifyContent:'space-around',alignItems: 'center',backgroundColor:'#eee'}}>
                <Text>{this.state.number}</Text>
                <TouchableHighlight onPress={()=>{
                    AppActions.addNumberAction(10);
                }}>
                    <Text>增加</Text>
                </TouchableHighlight>
                <TouchableHighlight onPress={()=>{
                    const navigator = this.props.navigator
                    if (navigator) {
                        navigator.pop()
                    }
                }}>
                    <Text>返回頁面</Text>
                </TouchableHighlight>
            </View>
        )
    }
}

個人理解,不一定正確

Flux 實現(xiàn)state的變化主要是根據(jù)EventEmitter進行通知改變鉴竭。所以使用的頁面都有

componentDidMount() {
AppStore.addChangeListener(this._onChange.bind(this));
}

componentWillUnmount() {
AppStore.removeChangeListener(this._onChange.bind(this));
}
_onChange() {
this.setState({
number: AppStore.getNumber()
});
}

三個方法歧譬。這三個方法實現(xiàn)并監(jiān)聽了number的變化,并改變state搏存,進行頁面的刷新瑰步。

初步理解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市璧眠,隨后出現(xiàn)的幾起案子缩焦,更是在濱河造成了極大的恐慌,老刑警劉巖责静,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袁滥,死亡現(xiàn)場離奇詭異,居然都是意外死亡泰演,警方通過查閱死者的電腦和手機呻拌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睦焕,“玉大人藐握,你說我怎么就攤上這事±埃” “怎么了猾普?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長本谜。 經常有香客問我初家,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任溜在,我火速辦了婚禮陌知,結果婚禮上,老公的妹妹穿的比我還像新娘掖肋。我一直安慰自己仆葡,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布志笼。 她就那樣靜靜地躺著沿盅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纫溃。 梳的紋絲不亂的頭發(fā)上腰涧,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音紊浩,去河邊找鬼窖铡。 笑死,一個胖子當著我的面吹牛郎楼,可吹牛的內容都是我干的万伤。 我是一名探鬼主播窒悔,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼呜袁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了简珠?” 一聲冷哼從身側響起阶界,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎聋庵,沒想到半個月后膘融,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡祭玉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年氧映,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脱货。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡岛都,死狀恐怖,靈堂內的尸體忽然破棺而出振峻,到底是詐尸還是另有隱情臼疫,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布扣孟,位于F島的核電站烫堤,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜鸽斟,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一拔创、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧富蓄,春花似錦伏蚊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帐萎,卻和暖如春比伏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疆导。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工赁项, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澈段。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓悠菜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親败富。 傳聞我的和親對象是個殘疾皇子悔醋,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容

  • 原教程內容詳見精益 React 學習指南,這只是我在學習過程中的一些閱讀筆記兽叮,個人覺得該教程講解深入淺出芬骄,比目前大...
    leonaxiong閱讀 2,833評論 1 18
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)鹦聪,斷路器账阻,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • ##Flux與面向組件化開發(fā)首先要明確的是,F(xiàn)lux并不是一個前端框架泽本,而是前端的一個設計模式淘太,其把前端的一個交互...
    吳小蛆閱讀 315評論 0 0
  • 數(shù)月前,F(xiàn)acebook 對外宣布了正在開發(fā)的 React Native 框架规丽,這個框架允許你使用 JavaScr...
    木易林1閱讀 1,185評論 0 1
  • (一)一心想改變卻經赤医荩回頭去看那個短發(fā)造成,勇敢的自己可真是懷念 (二)戴著耳機,閉上眼睛雄嚣。輕輕的想念晒屎,與你有關的一切...
    大小劉閱讀 232評論 0 2