Skip to content

Dva封装

Dva

jsx
import React from "react";
import ReactDOM from "react-dom";
import { createStore, combineReducers, applyMiddleware } from "redux";
import { Provider, connect } from "react-redux";
import createSagaMiddleware from "redux-saga";
import * as effects from "redux-saga/effects";
import { createHashHistory } from "history";
const NAMESPACE_SEPERATOR = "/";
export { connect };
export default function () {
  let app = {
    model,
    _models: [],
    router,
    _router: null,
    start,
  };
  function model(model) {
    app._models.push(model); //把传入的model存放起来
  }
  function router(routeConfig) {
    app._router = routeConfig; //把路由的配置暂存起来
  }
  function start(root) {
    //启动渲染
    let reducers = {};
    for (let model of app._models) {
      reducers[model.namespace] = function (state = model.state, action) {
        let actionType = action.type; //获取动作类型 counter/add  ['counter','add']
        let values = actionType.split(NAMESPACE_SEPERATOR);
        if (values[0] == model.namespace) {
          //如果说命名空间的名字和动作命名空间一样的话
          let reducer = model.reducers[values[1]]; //获取要进行计算状态的reducer
          if (reducer) return reducer(state, action);
        }
        return state;
      };
    }
    let reducer = combineReducers(reducers); //合并reducers
    let sagaMiddleware = createSagaMiddleware();
    function* rootSaga() {
      for (const model of app._models) {
        for (const key in model.effects) {
          yield effects.takeEvery(`${model.namespace}${NAMESPACE_SEPERATOR}${key}`, model.effects[key], effects);
        }
      }
    }
    let store = createStore(reducer, applyMiddleware(sagaMiddleware)); //创建仓库
    sagaMiddleware.run(rootSaga);
    const history = createHashHistory();
    let App = app._router({ app, history }); //获取要渲染的组件
    ReactDOM.render(
      //执行渲染
      <Provider store={store}>{App}</Provider>,
      document.querySelector(root)
    );
  }
  return app;
}

简单使用

javascript
import { adminCharacters, adminCharactersDelete } from "src/api/admin";

export default {
  namespace: "roleAdmin",
  state: {
    dataSource: [],
  },
  effects: {
    *fetchData({ id }, { call, put, select }) {
      const { data } = yield call(adminCharacters);
      yield put({
        type: "save",
        payload: {
          dataSource: data,
        },
      });
    },
    *deleteData({ id, cb }, { call, put }) {
      const { success } = yield call(adminCharactersDelete, id);
      if (success) {
        cb();
      }
    },
  },
  reducers: {
    save(state, { payload }) {
      return { ...state, ...payload };
    },
  },
};
最近更新