一、Action 是js對象,是改變State的唯一途徑
通過dispatch函數分發。
dispatch({ type: 'user/add', // 如果在 model 外調用,需要添加 namespace payload: {}, // 需要傳遞的信息 });
二、dispatch函數
用於觸發action函數,action只是描述一個行為的對象,dispatch 就是觸發這個行為的方式。Reducer則描述如何改變數據
三、Reducer
在dva中,reducers聚合積累的結果是當前model的state對象。通過actions傳入的值域當前reduceres中的值進行運算獲得新的值,Reducer必須是純函數。
app.model({
namespace:'todos',//model的namespace
state:[],//model的初始化數據
reducers:{
add(state,{payload:todo}){
return concat(todo);
}
}
})
dva-Effect 副作用,異步操作,Effects的最終流向是通過Reducers改變state 這個難理解一點點
app.model({
namespace:'todos',
effects:{
*addRemote({payload:todo},{put,call,select}){
const todos = yield select(state = >state.todos);//這邊的state來源於全局的state,select 方法提供獲取全局state的能力,也就是說,在這邊如果你有需要其他model的數據,則可以使用 state.modelName 來獲取
yield call(addTodo,todo);用於調用異步邏輯,只支持promise
yield put({type:'add',payload:todo});這里觸發action ,action 所調用的 reducer 或 effects 來源於本 model 那么在 type 中不需要聲明命名空間,如果需要觸發其他非本 model 的方法,則需要在 type 中聲明命名空間,如 yield put({ type: 'namespace/fuc', payload: xxx });
}
}
})
三、dva - Subscription
Subscriptions 是一種從 源 獲取數據的方法,語義:訂閱,用於訂閱數據源,然后來根據條件觸發dispatch 需要的action。
import key from 'keymaster';
...
app.model({
namespace: 'count',
subscriptions: {
keyEvent(dispatch) {
key('⌘+up, ctrl+up', () => { dispatch({type:'add'}) });
},
}
});
