一、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'}) }); }, } });