1. 程式人生 > >ReactNative之Redux入門(2)- 初步使用教程

ReactNative之Redux入門(2)- 初步使用教程

注:本教程針對於有過React/ReactNative開發經驗的人群。redux的用法很靈活,根據專案需求,先來學習針對於react-native的基礎用法。[redux] + [react-redux] + [redux-thunk]我在整理之前原本是像直接講redux,但是覺得講了也都不會,因為我是會用之後,過了好幾天才捋清楚基礎知識的,所以就直接先講用法。等會用之後,再深入學習。先簡述一下:redux:不用說,本場主角,上一節已經詳細介紹了。react-redux:這是redux作者針對於react-native封裝的。redux-thunk:處理非同步。(中介軟體-還有很多中介軟體)。所以在進行以下步驟的編碼過程中,先不需要理解,等實現了功能再說。後續章節將會詳細的來講解用法和意義。1.建立專案。react-native init ReactReduxDemo --version 0.51.0
2.匯入庫。npm install --save reduxnpm install --save react-reduxnpm install --save redux-thunknpm install --save react-navigation注:react-navigation是做路由用的,與redux無關。3.建立檔案和資料夾。在專案根目錄下建立app資料夾,名字隨便起,用於統一存放和管理程式碼。

在app目錄下分別建立actions、reducers、store資料夾。選擇建立page資料夾用來存放普通頁面。並建立Root.js、ActionType.js檔案。

畫紅線的是必須要有的。

4.編寫action、reducer、stort、Root.js、ActionType.js。那麼就讓我們做一個獲取天氣預報資訊,然後傳送給任意頁面,從任意頁面接收並靈活修改state的小例子吧。按部就班,讓我們一步一步來。ps:有道雲對程式碼支援不是很好,先湊合著看,如果有什麼讓有道雲可以對程式碼進行友好支援的工具,希望分享給我哈,謝謝。看到這裡如果不理解自己在做什麼就不要去理解了,先跟著我寫程式碼。---------------------------分界線---------------------------ActionType是全部type的集合,用於讓reducer判斷到底是哪個action發過來的。大白話來說就是給action起個名字,讓reducer根據名字找到action。ActionType.js
/** * create by AbyssKitty on 2018/01/18 * 所有的Action的type的集合*///export const LOGIN_DENGLU = 'login_denglu'; //初始化狀態 exportconstACTION_GETWEATHER_INIT='action_getweather_init';//exportconstACTION_GETWEATHER_SUCCESS='action_getweather_success';//---------------------------分界線---------------------------開啟並在actions資料夾內新建檔案GetWeatherAction.js。建立一個用來獲取天氣資訊的action。GetWeatherAction.js/** * create by AbyssKitty on 2017/12/06 * 獲取天氣預報的action*/import*asTYPESfrom'../ActionType';/** * 獲取天氣預報的action*/exportfunctionactionGetWeather(list){return(dispatch)=>{//開始獲取,傳送一個dispatchdispatch(init(list));/** * 在這裡假裝做了一個類似於調介面的操作*///獲取成功,傳送一個dispatchdispatch(success(list));}}/** * 這裡會通過dispatch把action送給reducer,TYPE是判斷拿到的是哪個action。*/functioninit(list){return{ type :TYPES.ACTION_GETWEATHER_INIT, message :'開始獲取', bean :list,}}functionsuccess(list){return{ type :TYPES.ACTION_GETWEATHER_SUCCESS, message :'獲取成功', bean :list,}}---------------------------分界線---------------------------然後我們在reducers資料夾下新建一個item資料夾和一個IndexReducers.js檔案在item資料夾下建立一個reducer檔案,並命名GetWeatherReducer.js(注item下存放所有的reducer檔案,並必須在IndexReducers.js中全部配置)如圖所示:在reducers的item中存放所有的reducer檔案。然後再IndexReducers.js統一處理。GetWeatherReducer.js/** * create by AbyssKitty on 2017/12/06 * reducers*/import*asTYPESfrom'../../ActionType';/** * 這裡可以初始化一個預設的實體類*/constinitialState={ status:'init', isSuccess:false, bean:null, message :'',}/** * 在這裡可以拿到action並return給IndexReducers.js進行分發。 * * 根據type判斷了是從哪個action過來的資料,並進行選擇性return。*/exportdefaultfunctiongetWeather(state=initialState,action){switch (action.type) {caseTYPES.ACTION_GETWEATHER_INIT:// 初始狀態returnObject.assign({},state,{ status:'init', isSuccess:false, bean :action.bean, message :action.message,});break;caseTYPES.ACTION_GETWEATHER_SUCCESS:// 初始狀態returnObject.assign({},state,{ status:'success', isSuccess:true, bean :action.bean, message :action.message,});break;default:returnstate;}}----------------IndexReducers.js/** * create by AbyssKitty on 2017/09/22 * 事件分發 總模組*/import{combineReducers}from'redux';importGetWeatherReducerfrom'./item/GetWeatherReducer';//這裡面必須要有初始資料 - 否則報錯constrootReducer=combineReducers({//GetWeatherReducer : GetWeatherReducer,GetWeatherReducer,});exportdefaultrootReducer;---------------------------分界線---------------------------在store資料夾中新建Store.js檔案,用來初始化配置redux。Store.js/** * create by AbyssKitty on 2017/12/06 * store 的配置檔案*/import{createStore,applyMiddleware}from'redux';importthunkMiddlewarefrom'redux-thunk';importrootReducerfrom'../reducers/IndexReducers';/** * applyMiddleware是一個 柯里化(Currying)函式,使用中介軟體redux-thunk * 最後返回一個store*/constcreateStoreWithMiddleware=applyMiddleware(thunkMiddleware)(createStore);exportdefaultfunctionconfigureStore(initialState){conststore=createStoreWithMiddleware(rootReducer,initialState)