Model:
model是dva最重要的概念,以下是經典的例子:
app.model({
namespace: 'todo',
state: [],
reducers: {
add(state, { payload: todo }) {
// 保存數據到 state
return [...state, todo];
},
},
effects: {
*save({ payload: todo }, { put, call }) {
// 調用 saveTodoToServer,成功后觸發 `add` action 保存到 state
yield call(saveTodoToServer, todo);
yield put({ type: 'add', payload: todo });
},
},
subscriptions: {
setup({ history, dispatch }) {
// 監聽 history 變化,當進入 `/` 時觸發 `load` action
return history.listen(({ pathname }) => {
if (pathname === '/') {
dispatch({ type: 'load' });
}
});
},
},
});
Model包括五個屬性:
namespace:
model的命名空間,同時namespace也是在全局state上的屬性,只能用字符串,不支持通過.的方式創建多層命名空間。
type:String
state:
初始值
reducers
以key/value的格式來定義reducer。用于處理同步操作,唯一可以修改state的地方,由action觸發。格式為:(state, action) => newState 或者 [(state, action) => newState, enhancer]
effects:
以key/value格式定義effect。用于處理異步操作和業務邏輯,不直接修改state。由action觸發,可以觸發 action,可以和服務器交互,可以獲取全局 state 的數據等等。