dva.js 解读

学习了dva,感觉好棒,在使用redex、redux-thunk中的中的疑问在dva中都有效的解决了。
1、model交叉引用
2、自动注册

先来一个实例
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' });
        }
      });
    },
  },
subscriptions: {
    setup({ dispatch, history }) {
      history.listen(({ pathname }) => {
        if (pathname === '/users') {
          dispatch({
            type: 'users/fetch',
          });
        }
      });
    },
  },
});

一、namespace

model 的命名空间,同时也是他在全局 state 上的属性,只能用字符串,不支持通过 . 的方式创建多层命名空间

1.1 effects

type 类型有:

  • takeEvery
  • takeLatest
  • throttle
  • watcher

在effects中跳转

import { router } from 'dva/router';
import router from 'umi/router';
 effects: {
    *save({ payload: todo }, { put, call }) {
      // 调用 saveTodoToServer,成功后触发 `add` action 保存到 state
      yield call(saveTodoToServer, todo);
      yield put({ type: 'add', payload: todo });
     // Inside Effects
     window.location.hash = activeKey;
      // yield put(router.push(activeKey)); // 路由跳转
    },
  },

你可能感兴趣的:(dva.js 解读)