天天看點

redux項目實戰應用筆錄

(1)首先搭建完畢後開始安裝依賴

redux
react-redux---------->基于redux開發,簡化文法
redux-thunk---------->異步中間件,實作redux 異步程式設計
redux-devtools-extension-------->調試專用,配合chrome拓展程式進行redux調試      

(2)建立項目目錄和對應檔案

  src下建立store目錄,然後建立檔案結構

  

redux項目實戰應用筆錄

  1、index核心子產品

    

redux項目實戰應用筆錄

  2、reducer純函數管理子產品

redux項目實戰應用筆錄
注意:
 *  向外預設暴露的是合并産生的總的reducer函數
 *  總的state的結構為: 
 *      {
 *          headTitle:'首頁',
 *          user:{}
 *      }
 *       

  3、actionCreators.js建立行為子產品,即action creator函數的子產品

redux項目實戰應用筆錄

  4、actionType.js即action的type常量辨別名稱的子產品

redux項目實戰應用筆錄

(3)開始使用

  1、提供器provider包裹根元件

redux項目實戰應用筆錄

  接下來啟動項目,在控制台檢視redux相關,如下所示

redux項目實戰應用筆錄

(4)使用redux管理頭部标題

  1、分析:頭部标題主要涉及到左側導航元件和頭部導航元件的互動,左側導航主要點選時候更新狀态,更新時需要對應的action和actionType,是以先編寫兩者

redux項目實戰應用筆錄
redux項目實戰應用筆錄

  2、接下來編寫reducer更新state

redux項目實戰應用筆錄

  注意:reducer下針對對象、數組、普通變量的修改操作不同,針對普通變量直接修改即可。如果是數組或對象最好使用深拷貝方案進行修改,不要直接修改

  因為這裡headTitle是對象格式,是以使用深拷貝方式,詳見React下reducer中處理數組&&對象的指派改動.

  3、接下來首先在頭部導航展示,最後在元件進行事件派發dispatch

  先看下之前的做法,之前做法是在初始化時結合目前路徑和menus清單對比,然後綁定到元件this執行個體,最後進行渲染,如下所示

redux項目實戰應用筆錄
redux項目實戰應用筆錄

  正常做法是用react-redux的connect方法,用容器元件包裝UI元件,這裡我們未來友善,直接在這裡操作

  首先在頭部元件導入連接配接器connect映射state和action

redux項目實戰應用筆錄
redux項目實戰應用筆錄
注意:
    connect傳入一般屬性用于顯示;函數屬性用于修改。這裡我們隻需顯示,是以隻傳入一般屬性即可      

  接下來元件裡之前擷取設定title的文法便不再需要,删除即可,改為redux擷取,如下所示

redux項目實戰應用筆錄

  此時可以顯示首頁

redux項目實戰應用筆錄

  4、接下來點選左側導航派發事件,更新store的state即可,是以接下來修改左側導航元件

  還是和之前一樣,導入connect方法,傳入state映射和行為映射,将UI元件包裹到容器元件裡,将元件改為容器元件

注意:
    無論讀取或是修改store的state,都需要利用connect包裝UI元件生成容器元件,即react-redux核心。      
redux項目實戰應用筆錄

  然後傳入行為映射action,接着觸發即可

redux項目實戰應用筆錄
redux項目實戰應用筆錄

  此時便可以正常預覽,且切換時也可以正常顯示。但是在某個頁面重新整理後便丢失了目前頁面标題。state又改為了首頁... ...,在顯示處添加判斷即可

redux項目實戰應用筆錄

  此時解決了重新整理重置state的問題,但退出重新登入後,會直接記錄退出時的state,如下所示,所說還需要進行修改

redux項目實戰應用筆錄

  解方案,登入重定向時直接到/home即可

redux項目實戰應用筆錄

(5)Redux管理使用者資料

  1、首先編寫一個用于登入的異步action,接收使用者名和密碼,請求成功後需要釋出同步action,是以接下來編寫接收使用者資訊的同步action。 

redux項目實戰應用筆錄

    接下來首先編寫actionTypes

redux項目實戰應用筆錄

    接下來去reducer做處理

redux項目實戰應用筆錄

    最後合并導出,完整如下

redux項目實戰應用筆錄
/**純函數管理子產品,根據現有的state和action,傳回新的state和action----純函數 */
import {combineReducers} from 'redux'
import storageUtils from '../utils/storageUtils'
import {
    SET_HAED_TITLE,
    ACCEPT_USER,
    ERROR_MESSAGE,
    RESET_USER
}from './actionTypes'

/**管理頭部标題 */
const defaultState = {
    headTitle:'首頁',
    user:storageUtils.getUser() || {}
}

/**管理頭部标題 */
const headTitle = (state=defaultState.headTitle,action) => {
    switch(action.type){
        case SET_HAED_TITLE:
            return action.value
        default:
            return state
    }
}

/**管理使用者資訊user */
const user = (state=defaultState.user,action) => {
    switch(action.type){
        case ACCEPT_USER:
            return Object.assign({},state,{...action.value})
        case ERROR_MESSAGE:
            const errorMessage = action.value
            return {...state,msg:errorMessage}/**示範錯誤提示,在user添加msg對象 */
        case RESET_USER:
            return {}/**置空store中的user對象 */
        default:
            return state
    }
}

/**使用combineReducers整合之前的reducer,變成新的reducer */
export default combineReducers({
    headTitle,user
})      

  接下來登入調用action,是以接下來操作Login.jsx元件,如下所示

  ①引入connect'連接配接器和異步action

redux項目實戰應用筆錄

  ②映射state和action,将元件改為容器元件

redux項目實戰應用筆錄

  ③引入使用

redux項目實戰應用筆錄

  此時登入成功後會有報錯,如下所示

redux項目實戰應用筆錄

  原因在于我們在項目裡很多地方依然使用者自定義記憶體memoryUtils.js,是以接下來依次更換為容器元件後,讀取redux下store的state.user即可

  2、退出功能

redux項目實戰應用筆錄

  将之前的操作去除,改為調用action,然後編寫退出action----logoutAction

redux項目實戰應用筆錄
redux項目實戰應用筆錄

  最後利用reducer.js修改state

redux項目實戰應用筆錄

(6)自定義Redux

  詳見React之自定義redux.