各大傳送門:react
DvaJS Githubgit
DvaJS API與示例es6
瞭解 dva
- dva = React-Router + Redux + Redux-saga + fetchgithub
- dva的初衷是(其實應該是redux的初衷)。提供一個公共的頂層的狀態管理工具,專門爲view層服務(實現雙向數據流),而讓react只專一專心負責渲染view層。redux
dva項目入口初始化api
在初始化的時候,指定使用的路由模式,這裏使用了hash模式。數組
import dva from 'dva'; import createHistory from 'history/createHashHistory'; // user BrowserHistory // import createHistory from 'history/createBrowserHistory'; // 1. Initialize const app = dva({ history: createHistory(), });
dva的幾個規則:
一、經過dispatch調用namespace/effects
二、state(狀態)
三、effects (異步操做)app
- 函數必須帶*,也就是生成器。
- 第一個參數,能夠拓展爲{payload, callback}
- 第二個參數,call和put
- call 就是調用 async的action函數
- put就是調用reducers的函數來更新state。異步
四、reducersasync
五、dva是以model爲單位的,全部的應用邏輯都在上面
簡而言之總結一下吧。開發dva分爲兩個階段:
一、準備階段:
- 定義 state 狀態,用以綁定到 view 層;
- 定義 effects
- call用來調用 action,相似dispatch
- put用來調用reducers
- 定義 sync action 函數,用來進行異步請求;
- 定義 reducers 函數,用來更新 state。
二、調用階段:
拿到dispatch
const { dispatch } = this.props dispatch({type: 'count/add'}) // this.props.dispatch({type: 'count/add'})
能夠直接調用 effects, 也能夠直接調用reducers。若是是同名的話,會一塊兒調用。優先執行reducers。
【dispatch 方法從哪裏來?被 connect 的 Component 會自動在 props 中擁有 dispatch 方法。】
簡單示例僞代碼
/** * 1、index.js 調用示例 handleClick () { const { dispatch } = this.props dispatch({ type: 'todo/save' } } 2、async func 示例 export async function saveTodoToServer(codetype) { return request(/api/framework/sys/code/list?codetype= + codetype); } */ export default { namespace: 'todo', state: {}, // 也能夠是數組: [] effects: { *save({ payload, callback }, { put, call }) { // 調用 async func saveTodoToServer yield call(saveTodoToServer, todo); // 調用 reducers 更新 state 能夠自由傳遞任何參數,必須保留type yield put({ type: 'add', title: payload.title, text: payload: text, time: payload: time }); }, }, reducers: { // 比較推薦es6的這樣寫:add(state, { title, text, time }) add(state, action) { const title = action.title const text = action.text const todo = { title: action.title, text: action.text, time: action.time } // 保存數據到 state return {...state, todo}; }, }, }