為什么越來越多的人選擇使用dva:
可能大家通過一點時間的學習,已經能夠理解 redux 的概念,並認可這種數據流的控制可以讓應用更可控,以及讓邏輯更清晰。
但隨之而來通常會有這樣的疑問:概念太多,並且 reducer, action 都是分離的(分文件)。
這帶來的問題是:
-
編輯成本高,需要在 reducer, action 之間來回切換
-
不便於組織業務模型 (或者叫 domain model) 。
而 dva 正是用於解決這些問題!
Diav介紹:
dva 是基於現有應用架構 (redux + react-router + redux-saga 等)的一層輕量封裝,沒有引入任何新概念,全部代碼不到 100 行。( Inspired by elm and choo. )
dva 是 framework,不是 library,類似 emberjs,會很明確地告訴你每個部件應該怎么寫,這對於團隊而言,會更可控。另外,除了 react 和 react-dom 是 peerDependencies 以外,dva 封裝了所有其他依賴。
dva 實現上盡量不創建新語法,而是用依賴庫本身的語法,比如 router 的定義還是用 react-router 的 JSX 語法的方式(dynamic config 是性能的考慮層面,之后會支持)。
他最核心的是提供了 app.model 方法,用於把 reducer, initialState, action, saga 封裝到一起,比如:
app.model({ namespace: 'products', state: { list: [], loading: false, }, subscriptions: [
function(dispatch) {
dispatch({type: 'products/query'}); }, ], effects: { ['products/query']: function*() {
yield call(delay(800));
yield put({ type: 'products/query/success', payload: ['ant-tool', 'roof'], }); }, }, reducers: { ['products/query'](state) {
return { ...state, loading: true, }; }, ['products/query/success'](state, { payload }) {
return { ...state, loading: false, list: payload }; }, }, });
在有 dva 之前,我們通常會創建 sagas/products.js, reducers/products.js 和 actions/products.js,然后在這些文件之間來回切換。
介紹下這些 model 的 key :(假設你已經熟悉了 redux, redux-saga 這一套應用架構)
-
namespace - 對應 reducer 在 combine 到 rootReducer 時的 key 值
-
state - 對應 reducer 的 initialState
-
effects - 對應 saga,並簡化了使用
-
reducers
