最近的項目是react+dva+atd+webpack的一個后台項目,剛接觸dva就感覺很喜歡,很簡潔用着很爽。
關於使用redux中的一些問題
1、文件切換問題、
redux的項目通常喲啊分為reducer、action、saga、component等等,我們需要在文件之間來回切換,並且文件通常是分目錄存放:
+ src + sagas - user.js + reducers - user.js + actions - user.js
所以我們要在幾個user.js中來回切換。
2、saga創建麻煩
在saga里面監聽一個action通常這樣寫
function *userCreate() { try { // Your logic here
} catch(e) {} } function *userCreateWatcher() { takeEvery('user/create', userCreate); } function *rootSaga() { yield fork(userCreateWatcher); }
對於redux-saga,這樣設計可以讓實現更加靈活,但實際項目中,大部分場景只需要用到takeEvery和takeLatest就足夠了,每個action的監聽都需要這么寫就顯得有些冗余。
3、enrty創建麻煩
除了redux store的創建,中間件的配置,路由的初始化。provider的store的綁定,saga的初始化,還要處理reducer、component、saga的HMR,看起來比較復雜
dva就是基於redux、redux-saga和react-router的輕量級前端框架
看下dva是如何來使用的
一、首先是定義路由,組成應用的不同頁面
定義路由組件,添加路由信息到路由表,編輯router.js
二、編寫UI組件
三、定義Model,處理數據和邏輯
通過model的概念吧一個領域的模型管理起來,包含同步更新state的reducers,處理異步邏輯的effects,訂閱數據源的subscriptions
四、connect起來
單獨完成了model和component,使用dva提供的connect方法,其實這個connect就是react-redux的connect
最好的學習方式就是自己先實現一個demo,有興趣在antd的文檔里有,可以動手敲一下
看一下幾個API來感受下dva的框架思想
數據流向
數據的改變發生通常是通過用戶交互行為或者瀏覽器的行為(如路由跳轉等)觸發,可以通過dispatch發起一個action,如果是同步行為會直接通過Reducer改變state,如果異步行為(副作用)會先觸發Effects,然后通過Reducer最終改變State,所以在dva中,數據流向非常清晰簡明

state表示Model的狀態數據,通常表現為一個js對象
Action 是一個普通的js對象,他是改變state的唯一途徑。無論是UI事件,網絡回調,還是webSocket等數據源所獲取的數據,最終都會通過dispatch函數調用一個action,從而改變對應數據。action必須帶有type屬性指明具體的行為,其他字段可以自定義,如果發起一個action需要使用dispatch函數,dispatch是在組件connect Model以后,通過props傳入的dispatch函數,action是改變state的唯一途徑,但是他只是描述了一個行為,dispatch可以看做是觸發這個行為的方式,而Reducer則是描述如何改變數據的
在dva中,connect Model的組件通過props可以訪問到dispatch,可以調用Model中的Reducer或者Effects,常見的形式
dispatch({ type: 'user/add', // 如果在 model 外調用,需要添加 namespace
payload: {}, // 需要傳遞的信息
});
Reducer:接受兩個參數,之前累積運算的結果和當前想要被累積的值,返回的是累積的結果,reducer來自於函數式編程,reducer是純函數,不應該產生任何副作用,每次運算都是返回一個全新的數據
Effect: 被稱為副作用,在應用中,最常見的就是異步操作。來自於函數編程的概念
Subscription:是一種從源獲取數據的方法,來自於elm(這里就是作者說的來自於餓了么的靈感啊),用於訂閱一個數據源,然后根據條件dispatch需要的action。數據源可以是當前的事件,服務器的websocket連接,keyboard輸入,history路由變化等等。
Router:通過瀏覽器的History API可以監聽瀏覽器url的變化,從而控制路由相關操作
Route Components:在dva中,通常需要connect Model的組件都是Route Components,組織在/routes/目錄下面,在/commponent/目錄下面則是純組件
參考資料
