react-native 中使用redux


對(duì)于剛學(xué)習(xí)rn的人來(lái)說(shuō)阱扬,看到redux肯定會(huì)一臉懵幽污。redux是干啥的呢,網(wǎng)上也有很多介紹咕痛,我就不做過(guò)多介紹了痢甘,個(gè)人把他理解成一個(gè) 小型數(shù)據(jù)庫(kù),用來(lái)處理數(shù)據(jù)的。更多詳細(xì)內(nèi)容看官方的吧茉贡,我只做一個(gè)個(gè)人對(duì)其理解的簡(jiǎn)單介紹塞栅。

首先我們知道rn中通過(guò)state、props這兩種方式控制組件腔丧,redux就是通過(guò)改變state來(lái)控制組件的變化放椰。怎么改變的呢,大體講一下流程吧:
1愉粤、首先我們點(diǎn)擊按鈕或者網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求回來(lái)的時(shí)候需要發(fā)消息到action內(nèi)
2砾医、action將消息預(yù)處理,即區(qū)分type衣厘,然后返回給store如蚜。
3、store將分類好的消息分配到reducer中處理state影暴。
4错邦、reducer接收到消息、根據(jù)type做對(duì)應(yīng)的處理坤检,生成新的state返回給store
5兴猩、store控制頁(yè)面渲染

不多說(shuō)了,還是邊上代碼邊做講解比較好早歇,先用著倾芝,然后慢慢再理解讨勤。當(dāng)我們使用redux的時(shí)候就需要在項(xiàng)目里添加redux依賴。

npm install --save redux
npm install --save react-redux
npm install --save redux-thunk

redux核心就三部分:Action晨另、Reducer潭千、Store。

  • Action
    想要更新state中的數(shù)據(jù)借尿,就要發(fā)起一個(gè)動(dòng)作刨晴,這就用到action了。Action內(nèi)部必須使用一個(gè)字符串類型的type來(lái)表示要執(zhí)行的動(dòng)作路翻。一般type都定義成字符串常量狈癞。Action只能描述有事情發(fā)生了,不能搞其他的茂契。
import * as types from '../constants/LoginTypes'

let user = {
    name: '小明',
    age: 25
}

// 這里發(fā)起Action
export function login() {
    return dispatch => {
        dispatch(isLogining());

        let result = fetch('https://www.baidu.com')
            .then((res) => {
                dispatch(loginSuccess(true, user))
            }).catch((err) => {
                dispatch(loginError(false))
            })
            
    }
}

// 這個(gè)Action標(biāo)識(shí)正在登錄
function isLogining () {
    return {
        type: types.LOGIN_IN_DOING
    }
}

// 這個(gè)Action標(biāo)識(shí)登錄成功
function loginSuccess(isSuccess, user)  {
    console.log('loginSuccess')
    return {
        type: types.LOGIN_IN_DONE,
        user: user.name
    }
}

// 這個(gè)Action標(biāo)識(shí)登錄失敗
function loginError(isSuccess){
    console.log('error')
    return {
        type: types.LOGIN_IN_ERROR

    }
}
  • Reducer
    reducer是干啥用的呢蝶桶,個(gè)人理解其實(shí)就是MVC中的Model模型。舉個(gè)例子吧掉冶,我們頁(yè)面要展示用戶名真竖、性別、年齡厌小、住址等信息恢共,這時(shí)我們服務(wù)端接口里給返回的格式如下,這時(shí)我們需要對(duì)這些字段做處理璧亚、存數(shù)據(jù)讨韭、發(fā)送給store做頁(yè)面展示用。reducer就干這個(gè)用的涨岁。
{
    status:0,
    userName:"小李",
    age:25,
    sex:"man"
    address:"北京"
}

還是直接上代碼吧

import * as types from '../constants/LoginTypes'

const initialState = {
    status: '點(diǎn)擊登錄',
    isSuccess: false,
    user: null
}

export default function longinIn(state = initialState, action) {
    switch (action.type) {
        case types.LOGIN_IN_DOING:
            return {
                ...state,
                status: '正在登錄',
                isSuccess: false,
                user: null
            }
            break;
        case types.LOGIN_IN_DONE:
            return {
                ...state,
                status: '登錄成功',
                isSuccess: true,
                user: action.user
            }
            break;
        case types.LOGIN_IN_ERROR:
            return {
                ...state,
                status: '登錄失敗',
                isSuccess: false,
                user: null
            }
        default:
            return state;

    }
}

// 當(dāng)然我們會(huì)有多個(gè)reducer拐袜,那么我們需要把不同的reducer關(guān)聯(lián)到一起提供給store

import { combineReducers } from 'redux'

import loginIn from './loginReducer'
import counterIn from './CounterReducer'

module.exports =  combineReducers({
    loginIn:loginIn,
    counterIn:counterIn
})

有碼就好理解我說(shuō)的model了吧,initialState是初始化梢薪。下邊是根據(jù)action的type類型做相應(yīng)的處理蹬铺。

  • Store
    store是把a(bǔ)ction、reducer聯(lián)系到一起的對(duì)象秉撇。它負(fù)責(zé)一下職責(zé)
  • 維持應(yīng)用的 state甜攀;
  • 提供 getState() 方法獲取 state;
  • 提供 dispatch(action) 方法更新 state琐馆;
  • 通過(guò) subscribe(listener) 注冊(cè)監(jiān)聽器;
  • 通過(guò) subscribe(listener) 返回的函數(shù)注銷監(jiān)聽器规阀。
'use strict';

import { createStore, applyMiddleware } from 'redux';

import thunkMiddleware from 'redux-thunk';

import rootReducer from '../reducers/index';

const createStoreWithMiddleware = applyMiddleware(thunkMiddleware)(createStore);

export default function configureStore(initialState) {

    const store = createStoreWithMiddleware(rootReducer, initialState)

    return store;

}

Redux 應(yīng)用只有一個(gè)單一的store。當(dāng)需要拆分?jǐn)?shù)據(jù)處理邏輯時(shí)瘦麸,你應(yīng)該使用 reducer 組合 而不是創(chuàng)建多個(gè) store谁撼。

  • 上邊三步還不行,還需要下邊最重要的一步滋饲,state關(guān)聯(lián)
const mapStateToProps = (state) => {
  return {
    user: state.loginIn.user,
  }
}

const mapDispatchToProps = (dispatch) => {
  return {
    actions: bindActionCreators({
      ...loginAction
    }, dispatch)
  }
}
module.exports = connect(mapStateToProps, mapDispatchToProps, undefined, { withRef: true })(App)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厉碟,一起剝皮案震驚了整個(gè)濱河市喊巍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箍鼓,老刑警劉巖崭参,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異款咖,居然都是意外死亡何暮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門铐殃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)海洼,“玉大人,你說(shuō)我怎么就攤上這事背稼》【” “怎么了玻蝌?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蟹肘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我俯树,道長(zhǎng)帘腹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任许饿,我火速辦了婚禮阳欲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陋率。我一直安慰自己球化,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布瓦糟。 她就那樣靜靜地躺著筒愚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菩浙。 梳的紋絲不亂的頭發(fā)上巢掺,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音劲蜻,去河邊找鬼陆淀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛先嬉,可吹牛的內(nèi)容都是我干的轧苫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼疫蔓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼含懊!你這毒婦竟也來(lái)了钾军?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绢要,失蹤者是張志新(化名)和其女友劉穎吏恭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體重罪,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡樱哼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剿配。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搅幅。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呼胚,靈堂內(nèi)的尸體忽然破棺而出茄唐,到底是詐尸還是另有隱情,我是刑警寧澤蝇更,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布沪编,位于F島的核電站,受9級(jí)特大地震影響年扩,放射性物質(zhì)發(fā)生泄漏蚁廓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一厨幻、第九天 我趴在偏房一處隱蔽的房頂上張望相嵌。 院中可真熱鬧,春花似錦况脆、人聲如沸饭宾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)看铆。三九已至,卻和暖如春笆搓,著一層夾襖步出監(jiān)牢的瞬間性湿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工满败, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肤频,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓算墨,卻偏偏與公主長(zhǎng)得像宵荒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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