React Native中整合Redux

摘要:

最近快压,公司準備使用React Native開發(fā)一個檔案APP便瑟,我在學習了一段時間之后枯饿,結(jié)合網(wǎng)上前輩們的資料,最終整理了一份基于React Native闹炉、Redux的demo蒿赢。下面進入正題

安裝模塊

npm install --save-dev redux
npm install --save-dev react-redux
npm install --save-dev redux-logger
npm install --save-dev redux-devtools
npm install --save-dev redux-thunk
屏幕快照 2018-11-23 13.59.14.png

具體版本號如上圖所示,另渣触,React Native項目的版本號是0.57

新建ActionTypes.js文件

// 在使用redux過程中羡棵,需要給每個動作添加一個actionTypes類型
export const GET_CLASSIFIES = 'GET_CLASSIFIES';

新建CountAction.js文件,網(wǎng)絡請求一般都是放在action文件中

import {
    GET_CLASSIFIES
} from './actiontypes/ActionTypes';
import {
    QUERY_CLASSIFY
} from '../api/';

// 每個頁面是可以有多個action的昵观,只需要在頁面中引入就好
const getClassifies = () => {
    return async (dispatch) => {
        let msg = await fetch(QUERY_CLASSIFY, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            }
        }).then(response => response.json());

        dispatch({
            type: GET_CLASSIFIES,
            data: msg
        })
    }
};

export {
    getClassifies
}

/**
 * react-redux的執(zhí)行流程:
 * component -> actionCreator(data) -> reducer -> component
 */

新建RootReducer.js文件

// RootReducer中存放的是各個頁面的Reducer晾腔,推薦的做法是
// 一個頁面公用一個Reducer,便于之后的管理
// Reducer是純函數(shù)啊犬,里面不應該有過多的邏輯
import {combineReducers} from 'redux';
import CountReducer from './CountReducer';

// 取決于這里加入了多少 reducer
const RootReducer = combineReducers({
    countReducer: CountReducer
});

export default RootReducer;

新建CountReducer.js文件

import {
    GET_CLASSIFIES
} from '../actions/actiontypes/ActionTypes';

// 原始默認state
const defaultState = {
    count: 5,
    factor: 1,
    data: ''
};

export default function counter(state=defaultState, action) {
    switch(action.type) {
        case GET_CLASSIFIES:
            return {...state, count: state.count + state.factor, data: action.data};

        default:
            return state;
    }
}

新建ConfigureStore.js文件

import {
    createStore,
    applyMiddleware,
    compose
} from 'redux';
// redux-thunk是用來發(fā)送異步請求的中間件灼擂,用了thunk之后,
// 一般的操作是將網(wǎng)絡請求的方法放在action中
import thunk from 'redux-thunk';
// redux-logger是打印logger的中間件
import createLogger from 'redux-logger';
import RootReducer from '../reducers/RootReducer';

const configureStore = preloadState => {
    // createStore(reducer, [initState, enhancer]):創(chuàng)建一個Redux Store來存放所有的
    // state觉至,一個應用只能有一個store剔应。函數(shù)返回store對象.enhancer:一個中間件
    return createStore(
        RootReducer,
        preloadState,
        compose(
            applyMiddleware(createLogger, thunk)
        )
    );
};

const store = configureStore();
export default store;

新建CountButton.js頁面

import React, {Component} from 'react';
import {
    View,
    Text,
    Button,
    FlatList,
    StyleSheet
} from 'react-native';
import {connect} from 'react-redux';
import {
    getClassifies
} from '../../redux/actions/CountAction';

class CountButton extends Component {

    constructor(props) {
        super(props);
    }

    _onPressDec() {
        this.props.dispatch(getClassifies());
    }

    render() {
        const {msg, data} = this.props.countReducer.data;

        return (
            <View style={styles.container}>
                <View style={styles.buttonContainer}>
                    <Button
                        title='decrement'
                        onPress={() => this._onPressDec()}/>
                </View>
                <Text>{msg}</Text>
                <FlatList
                    data={data}
                    renderItem={({item}) => <Text style={styles.item}>{item.id} {item.phone}</Text>}
                    keyExtractor={(item) => item.id.toString()}/>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        marginTop: 40,
        alignItems: 'center',
        justifyContent: 'center',
    },
    buttonContainer: {
        margin: 10
    },
    item: {
        padding: 10,
        fontSize: 18,
        height: 44
    }
});

const mapStateToProps = state => {
    const {countReducer} = state;
    return {
        countReducer
    };
};

// 連接React組件與Redux store
export default connect(mapStateToProps)(CountButton);

總結(jié),我這面主要是提供一份完整的demo,至于redux中的action峻贮,reducer之間的管理席怪,以及redux的實現(xiàn)原理,網(wǎng)上資料超級多纤控,請自行查找挂捻,此處不在贅述。
項目地址:https://github.com/SUNOW2/RnDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末船万,一起剝皮案震驚了整個濱河市刻撒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耿导,老刑警劉巖声怔,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舱呻,居然都是意外死亡醋火,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門箱吕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芥驳,“玉大人,你說我怎么就攤上這事殖氏⊥硎鳎” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵雅采,是天一觀的道長爵憎。 經(jīng)常有香客問我,道長婚瓜,這世上最難降的妖魔是什么宝鼓? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮巴刻,結(jié)果婚禮上愚铡,老公的妹妹穿的比我還像新娘。我一直安慰自己胡陪,他們只是感情好沥寥,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柠座,像睡著了一般邑雅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妈经,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天淮野,我揣著相機與錄音捧书,去河邊找鬼。 笑死骤星,一個胖子當著我的面吹牛经瓷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洞难,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼舆吮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了廊营?” 一聲冷哼從身側(cè)響起歪泳,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎露筒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敌卓,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡慎式,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趟径。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘪吏。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜗巧,靈堂內(nèi)的尸體忽然破棺而出掌眠,到底是詐尸還是另有隱情,我是刑警寧澤幕屹,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布蓝丙,位于F島的核電站,受9級特大地震影響望拖,放射性物質(zhì)發(fā)生泄漏渺尘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一说敏、第九天 我趴在偏房一處隱蔽的房頂上張望鸥跟。 院中可真熱鬧,春花似錦盔沫、人聲如沸医咨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拟淮。三九已至,卻和暖如春侈贷,著一層夾襖步出監(jiān)牢的瞬間惩歉,已是汗流浹背等脂。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撑蚌,地道東北人上遥。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像争涌,于是被迫代替她去往敵國和親粉楚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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

  • 前言 如果要看理論的童鞋點擊這里 redux中文文檔 或者 redux官方文檔 亮垫,本文不會太刻意去介紹大篇幅的理論...
    giants_one閱讀 10,044評論 1 49
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,286評論 25 707
  • 用兩張圖告訴你模软,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,744評論 2 59
  • 本書的兩個主要目的:1.讓我們有清楚的屬天觀點饮潦,這樣我們才能不斷地以神的眼光來看自己燃异;2.發(fā)覺喜樂的恩典源頭,并藉...
    當兵的華盛頓閱讀 2,328評論 0 0
  • ——選曲《飛女正傳》 彎起頭望向我猶如一未曾相逢的初生稚子 被迷戀的眼無所例外都飽含一種溢彩故事 你顯然單薄到無端...
    畢畢剝剝閱讀 530評論 0 0