關於dva的一些認識


為什么越來越多的人選擇使用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.jsreducers/products.js 和 actions/products.js,然后在這些文件之間來回切換。

介紹下這些 model 的 key :(假設你已經熟悉了 redux, redux-saga 這一套應用架構)

  • namespace - 對應 reducer 在 combine 到 rootReducer 時的 key 值

  • state - 對應 reducer 的 initialState

  • effects - 對應 saga,並簡化了使用

  • reducers


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM