React Native Typescript Redux快速搭建

使用Visual Studio Code和typescript 開發(fā)調(diào)試React Native項目 之后,這次我們繼續(xù) React Native Typescript 系列

項目初始化的細(xì)節(jié)就不一一敘述的,感興趣的同學(xué)可以看下上面兩篇博客僵娃,我把最終代碼放到了 我的github倉庫上,里面有每個步驟的修改的代碼記錄察署。

原來的樣子

首先我們修改我們的src/index.tsx 實現(xiàn)一個簡單的計數(shù)器 代碼如下

import React, { Component } from "react";
import {
    StyleSheet,
    Text,
    View,
    Button,
    Platform
} from "react-native";
interface Props {
}
interface State {
    count:number;
}
const instructions = Platform.select({
    ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
    android:
      'Double tap R on your keyboard to reload,\n' +
      'Shake or press menu button for dev menu',
  });
export default class App extends Component<Props, State> {
    constructor(props:Props)
    { 
        super(props);
        this.state={count:0};
       
    }
    add = ()=>{

        this.setState({count:this.state.count+1})
    };
    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.welcome}>Welcome to React Native&typescript!</Text>
                <Text style={styles.instructions}>To get started, edit src/App.js</Text>
                <Text style={styles.instructions}>{instructions}</Text>
                <Text style={styles.instructions}>{this.state.count}</Text>
                <Button  onPress={this.add}  title="add" ></Button>
            </View>
        );
    }
}
const styles = StyleSheet.create({
    container: {
      flex: 1,
      justifyContent: 'center',
      alignItems: 'center',
      backgroundColor: '#F5FCFF',
    },
    welcome: {
      fontSize: 20,
      textAlign: 'center',
      margin: 10,
    },
    instructions: {
      textAlign: 'center',
      color: '#333333',
      marginBottom: 5,
    },
  });

開始redux

接下來我們按照Redux管理React數(shù)據(jù)流實現(xiàn)代碼
在開始之前我們學(xué)習(xí)下Redux


react-native-typescript-redux-201877184819

在圖中咨油,使用Redux管理React數(shù)據(jù)流的過程如圖所示袁余,Store作為唯一的state樹屎蜓,管理所有組件的state霉涨。組件所有的行為通過Actions來觸發(fā)惫周,然后Action更新Store中的state,Store根據(jù)state的變化同步更新React視圖組件尘惧。
需要注意的是:
在主入口文件index.tsx中,通過Provider標(biāo)簽把Store和視圖綁定:

<Provider store={store}>
    //項目代碼
</Provider>

actions

指全局發(fā)布的動作指令递递,主要就是定義所有事件行為的

首先聲明定義 actionsTypes
actionsTypes.ts

export const ADD ="ADD";

新建actions.ts

import {ADD} from './actionsTypes';

const add=()=>({type:ADD})
export {
    add
}

reducers

Store是如何具體管理State呢褥伴?實際上是通過Reducers根據(jù)不同的Action.type來更新不同的state,即(previousState,action) => newState漾狼。最后利用Redux提供的函數(shù)combineReducers將所有的Reducer進(jìn)行合并重慢,更新整個State樹

會用到的state類型
statesTypes.ts

export class CounterState{
    count:number
}

新建reducers.ts

import { combineReducers } from 'redux';
import {ADD} from './actionsTypes';
import {CounterState} from './statesTypes';

const defaultState={
    count:0
} as CounterState;
function counter(state=defaultState,action:any){
switch (action.type) {
    case ADD:
        return {...state,count:state.count+1};
    default:
        return state;
}
}
export default combineReducers({
    counter:counter
});

store

在 Redux 應(yīng)用中,只允許有一個 store 對象逊躁,管理應(yīng)用的 state.可以理解為一個存放APP內(nèi)所有組件的state的倉庫.
可以通過 combineReducers(reducers) 來實現(xiàn)對 state 管理的邏輯劃分(多個 reducer)似踱。

新建store.ts

import { createStore, applyMiddleware, compose } from 'redux';
import rootReducer from './reducers';

const store=createStore(rootReducer);
export default store;

Provider

Provider 本身并沒有做很多事情,只是把 store放在 context 里罷了稽煤,本質(zhì)上 Provider 就是給 connect 提供 store 用的核芽。

新建index.tsx

import React, { Component } from 'react';
import { Provider } from 'react-redux';
import Home from './home';
import store from './store';

export default class App extends Component {
  render() {
    return (
      <Provider store={store}>
        <Home/>
      </Provider>
    );
  }
}

Container

利用Container容器組件作為橋梁,將React組件和Redux管理的數(shù)據(jù)流聯(lián)系起來酵熙。Container通過connect函數(shù)將Redux的state和action轉(zhuǎn)化成展示組件即React組件所需的Props轧简。

新建home.tsx

import React, { Component } from 'react';
import {
  StyleSheet,
  Text,
  View,
  Button,
  Platform
} from 'react-native';
import { connect, DispatchProp } from 'react-redux';
import { add } from './actions';
import {CounterState} from './statesTypes';

interface State {
}
type Props=CounterState&DispatchProp
const instructions = Platform.select({
    ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',
    android:
      'Double tap R on your keyboard to reload,\n' +
      'Shake or press menu button for dev menu',
  });
class Home extends Component<Props, State> {
    constructor(props:Props)
    {
        super(props);
    }
    _add = ()=>{

        this.props.dispatch(add())
    };
    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.welcome}>Welcome to React Native&typescript!</Text>
                <Text style={styles.instructions}>To get started, edit src/App.js</Text>
                <Text style={styles.instructions}>{instructions}</Text>
                <Text style={styles.instructions}>{this.props.count}</Text>
                <Button  onPress={this._add}  title="add" ></Button>
            </View>
        );
    }
}
const styles = StyleSheet.create({
    container: {
      flex: 1,
      justifyContent: 'center',
      alignItems: 'center',
      backgroundColor: '#F5FCFF',
    },
    welcome: {
      fontSize: 20,
      textAlign: 'center',
      margin: 10,
    },
    instructions: {
      textAlign: 'center',
      color: '#333333',
      marginBottom: 5,
    },
  });

  const mapStateToProps = (state:any) => (
    state.counter
)

export default connect(mapStateToProps)(Home);

最終代碼在 https://github.com/YahuiWong/react-native-typescript/tree/114aefbd3fbb96f9c67db068b340b908ed54276d
可在線查看

如果覺得有用,請Star 匾二,謝謝哮独!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市察藐,隨后出現(xiàn)的幾起案子皮璧,更是在濱河造成了極大的恐慌,老刑警劉巖分飞,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悴务,死亡現(xiàn)場離奇詭異,居然都是意外死亡譬猫,警方通過查閱死者的電腦和手機(jī)讯檐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門羡疗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人别洪,你說我怎么就攤上這事顺囊。” “怎么了蕉拢?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诚亚。 經(jīng)常有香客問我晕换,道長,這世上最難降的妖魔是什么站宗? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任闸准,我火速辦了婚禮,結(jié)果婚禮上梢灭,老公的妹妹穿的比我還像新娘夷家。我一直安慰自己,他們只是感情好敏释,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布库快。 她就那樣靜靜地躺著,像睡著了一般钥顽。 火紅的嫁衣襯著肌膚如雪义屏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天蜂大,我揣著相機(jī)與錄音捐下,去河邊找鬼锁保。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桌粉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼紊遵,長吁一口氣:“原來是場噩夢啊……” “哼窄绒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起成洗,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扎瓶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泌枪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體概荷,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年碌燕,在試婚紗的時候發(fā)現(xiàn)自己被綠了误证。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片继薛。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖愈捅,靈堂內(nèi)的尸體忽然破棺而出遏考,到底是詐尸還是另有隱情,我是刑警寧澤蓝谨,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布灌具,位于F島的核電站,受9級特大地震影響譬巫,放射性物質(zhì)發(fā)生泄漏咖楣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一芦昔、第九天 我趴在偏房一處隱蔽的房頂上張望诱贿。 院中可真熱鬧,春花似錦咕缎、人聲如沸珠十。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焙蹭。三九已至,卻和暖如春嫂伞,著一層夾襖步出監(jiān)牢的瞬間壳嚎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工末早, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烟馅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓然磷,卻偏偏與公主長得像郑趁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姿搜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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