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

  

    

  

 posted on 2018-04-13 15:34  Leifmin.Lin  阅读(2173)  评论(0编辑  收藏  举报