React Native開(kāi)源項(xiàng)目筆記(1):redux管理數(shù)據(jù)

首先放上開(kāi)源項(xiàng)目的地址:React-Native開(kāi)源項(xiàng)目iShiWuPai
這邊筆記主要是記錄看開(kāi)源項(xiàng)目iShiWuPai之后的一些知識(shí)點(diǎn)冰更。前端的話一般都是使用的MVC框架,這樣的話我也是從這三個(gè)方面學(xué)習(xí)戏挡,這個(gè)項(xiàng)目中的數(shù)據(jù)的話用的是Redux框架妇萄,View的話就是使用ReactNative框架笙隙。

手繪

index.ios.js文件

import React from 'react';
import { AppRegistry } from 'react-native';
import Root from './app/root';

AppRegistry.registerComponent('iShiWuPai', () => Root);

Root 文件是主入口石景,AppRegister.registerComponent() 方法是用來(lái)注冊(cè)ReactNative捐康,第一個(gè)字符串要和iOS項(xiàng)目中注冊(cè)的一致贞滨,第二個(gè)傳入的是根類入热。

這里的 ()=>Root 的寫(xiě)法有點(diǎn)像iOS的Block塊,姑且當(dāng)做是JS里面匿名函數(shù)的寫(xiě)法吧晓铆。

root.js文件

import React from 'react';
import { Provider } from 'react-redux';
//這個(gè)是結(jié)構(gòu)化好的state數(shù)據(jù)
import store from './store/store';
//這個(gè)是項(xiàng)目的主要邏輯
import App from './containers/app';

export default class Root extends React.Component {
    render() {
        return (
            <Provider store = {store} >
                 <App />
            </Provider>
        )
    }
}

這里使用到了react-redux文件勺良,redux 主要是用來(lái)處理數(shù)據(jù),管理state而存在的骄噪,將工程中使用的所有state結(jié)構(gòu)化成樹(shù)結(jié)構(gòu)尚困,這樣的話就可以跟蹤state的變化(大概就先了解這么多,以后再具體研究)链蕊。使用方法大概就是引入 Provider 類事甜,并且將準(zhǔn)備好的 store(就是已經(jīng)結(jié)構(gòu)化好的數(shù)據(jù))傳入谬泌。剛開(kāi)始學(xué)習(xí)的時(shí)候不太懂怎么使用其他文件中的類的,這里看到 export 關(guān)鍵字就聯(lián)系到了iOS中的 public 關(guān)鍵字逻谦,這樣的話只要導(dǎo)入這個(gè)文件之后就可以直接使用 export 修飾的類了掌实。

數(shù)據(jù)流

這里參考了文章:redux入門(mén)

store.js文件

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from '../reducers/rootRudcer';

let createStoreWithMiddleware = applyMiddleware(thunk)(createStore);
let store = createStoreWithMiddleware(rootReducer);
// let state = store.getState();
// alert(state.Search.searchText)
export default store;

這里 reduxredux-thunk 的使用方法就是像代碼里寫(xiě)的一樣。reducer 是用來(lái)管理 stateaction 類邦马,這里每個(gè)頁(yè)面的數(shù)據(jù)就是使用一個(gè) reducer 贱鼻,rootReducer 是各個(gè) reducer 的集合。 action 是用來(lái)更新 state 的滋将,因?yàn)閷⑺械膕tate都集中在一起管理邻悬,那么用 action 來(lái)更新 state 就不會(huì)產(chǎn)生混亂了。就是可以理解成 reducer 提供了一個(gè)容器随闽,在這個(gè)容器里面用 action 來(lái)更新 state 父丰。let store = createStoreWithMiddleware(rootReducer); 這句換就是將 reducerstore 發(fā)生關(guān)聯(lián),這樣當(dāng) store 里面的數(shù)據(jù)發(fā)生改變的時(shí)候就會(huì)觸發(fā) Action 事件橱脸。

middleware是用來(lái)實(shí)現(xiàn) dispatch 方法的異步或者同步執(zhí)行等不同的狀態(tài)础米,這里使用的是異步的 dispatch 方法。

更新state流程
middleware作用

strollingReucer.js

//定義所有types的地方
import * as types from '../actions/actionTypes';
const initialState = {
    bannerList: [],
    feedList: [],
    isLoading: true,
    isLoadMore: false,
    isRefreshing: false,
};

let strollingReducer = (state = initialState, action) => {

    switch (action.type) {
        case types.FETCH_BANNER_LIST:
            return {
                ...state,
            }
        case types.RECEIVE_BANNER_LIST:
            return Object.assign({}, state, {
                bannerList: action.bannerList,
            })
        case types.FETCH_FEED_LIST:
            return Object.assign({}, state, {
                isLoadMore: action.isLoadMore,
                isRefreshing: action.isRefreshing,
                isLoading: action.isLoading,
            })
        case types.RECEIVE_FEED_LIST:
            return Object.assign({}, state, {
                feedList: state.isLoadMore ? state.feedList.concat(action.feedList) : action.feedList,
                isRefreshing: false,
                isLoading: false,
            })
        default:
            return state;
    }
}

export default strollingReducer;

reducer 的任務(wù)就是將傳入的舊 stateaction 更新并返回新的 state 添诉。示例代碼中的 strollingReducer 就是 rootReducer 中的一個(gè)。

strollingActions.js文件

import * as types from './actionTypes';
import Util from '../common/utils';

export let fetchBanners = ()=> {
    let URL = 'http://food.boohee.com/fb/v1/home/banners';

    return dispatch => {
        // 請(qǐng)求輪播數(shù)據(jù)
        dispatch(fetchBannerList());

        return Util.get(URL, (response) => {
            dispatch(receiveBannerList(response.banners))
        }, (error) => {
            console.log('Fetch banner list error: ' + error);
            dispatch(receiveBannerList([]));
        });
    }
}

let fetchBannerList = ()=> {
    return {
        type: types.FETCH_BANNER_LIST,
    }
}

let receiveBannerList = (bannerList) => {
    return {
        type: types.RECEIVE_BANNER_LIST,
        bannerList: bannerList,
    }
}

這是對(duì)應(yīng)的的 strolling 類的 action 文件,這里需要更新 state 的情況就是加載網(wǎng)絡(luò)數(shù)據(jù)之后更新医寿。之前一直在想 strollingAction 是如何將自身傳遞給 strollingReducer 的栏赴,這里是自己理解的 dispatch 的作用。既然最后要將 reducer 合并成一個(gè)靖秩,這樣的話 dispatch 直接操作的是 state 樹(shù)結(jié)構(gòu)须眷,所有的 action 也都會(huì)返回一個(gè)固定的結(jié)構(gòu):

let receiveBannerList = (bannerList) => {
    return {
        type: types.RECEIVE_BANNER_LIST,
        bannerList: bannerList,
    }
}

這里返回的就是一個(gè) action ,格式基本上就是這樣沟突。

Strolling.js文件

componentDidMount() {
        InteractionManager.runAfterInteractions(() => {
            const {dispatch} = this.props;
            dispatch(fetchBanners());
            dispatch(fetchFeeds(page, canLoadMore, isRefreshing, isLoading));
        });
    }

render() {

        const {Strolling} = this.props;

        let bannerList = Strolling.bannerList;
        let feedList = Strolling.feedList;
        let sourceData = {'banner': [bannerList], 'feed': feedList};

        let sectionIDs = ['banner', 'feed'];
        let rowIDs = [[0]];
                ...
    }

Strolling 中使用數(shù)據(jù)的時(shí)候有兩個(gè)個(gè)地方?jīng)]有看明白花颗, const {dispatch} = this.propsconst {Strolling} = this.props 。通過(guò)查 redux 文檔惠拭,原來(lái)這個(gè)地方能從props里直接取到 dispatchStrolling 是因?yàn)榭蚣苷{(diào)用了React Redux connect()注入props扩劝。這樣的話就做到了數(shù)據(jù)的傳輸使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末职辅,一起剝皮案震驚了整個(gè)濱河市棒呛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌域携,老刑警劉巖簇秒,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秀鞭,居然都是意外死亡趋观,警方通過(guò)查閱死者的電腦和手機(jī)扛禽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)皱坛,“玉大人旋圆,你說(shuō)我怎么就攤上這事◆锘校” “怎么了灵巧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)抹沪。 經(jīng)常有香客問(wèn)我刻肄,道長(zhǎng),這世上最難降的妖魔是什么融欧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任敏弃,我火速辦了婚禮,結(jié)果婚禮上噪馏,老公的妹妹穿的比我還像新娘麦到。我一直安慰自己,他們只是感情好欠肾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布截汪。 她就那樣靜靜地躺著夕吻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霍转,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天色鸳,我揣著相機(jī)與錄音航唆,去河邊找鬼仔雷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛葛碧,可吹牛的內(nèi)容都是我干的借杰。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼进泼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔗衡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缘琅,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粘都,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后刷袍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翩隧,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堆生。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片专缠。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖淑仆,靈堂內(nèi)的尸體忽然破棺而出涝婉,到底是詐尸還是另有隱情,我是刑警寧澤蔗怠,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布墩弯,位于F島的核電站,受9級(jí)特大地震影響寞射,放射性物質(zhì)發(fā)生泄漏渔工。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一桥温、第九天 我趴在偏房一處隱蔽的房頂上張望引矩。 院中可真熱鬧,春花似錦侵浸、人聲如沸旺韭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)区端。三九已至,卻和暖如春履腋,著一層夾襖步出監(jiān)牢的瞬間珊燎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工遵湖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晚吞。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓延旧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親槽地。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迁沫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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