umi框架状态管理最佳实践--dva

2,670 阅读2分钟

umi框架状态管理最佳实践--dva

Dva 首先是一个基于 reduxredux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-routerfetch,所以也可以理解为一个轻量级的应用框架。 -- dva官网

状态管理对于一个项目来说,非常重要,组件式开发,尤其是那种交互比较复杂,嵌套比较深的,组件之间的传参非常的难受,经常会有需要跨组件传参,还有一些是祖孙之类的,所以想要更好的开发体验,必须要有状态管理,否则很难实现很好的组件拆分;

在umi框架中,使用dva作为状态管理是非常棒的体验;下面介绍下 如何使用;

一,定义状态文件

  1. 在models文件夹下 比如创建文件login.ts;umi在框架层面已经帮我们声明了,只要在models文件夹下面的文件会自动声明为状态管理文件;
  import { Action, Reducer } from 'umi';
  import { noauthApi, loginApi, userApi } from '@/api';
  export default {
    state: {
      homeData: {},
    },
    effects: {
      // 获取班级配置信息
      *homeDataFetch({ payload, callback }, { call, put }) {
        // 执行异步函数
        const res = yield call(() => noauthApi.classConfigGet(payload));
        if (res?.success) {
          callback && callback(res?.data);
          yield put({ type: 'homeDataSet', payload: res?.data });
        }
      },
      // 登出
      *logoutFetch({ payload, callback }, { call, put }) {
        // 执行异步函数
        const res = yield call(() => loginApi.logout(payload));
        if (res?.success) {
          callback && callback();
        }
      },
    },
    reducers: {
      homeDataSet(state: any, { payload = {} }): Reducer {
        return {
          ...state,
          homeData: payload,
        };
      },
    },
  };
  
  1. 介绍下几个概念
    • state是存储状态的
    • effects对象里面放得是ajax方法 使用迭代器
    • reducers存放的是改变状态state的方法

二,具体应用

  1. 第一步 在顶部引入

    import { useDispatch, useSelector } from 'dva'; // 引入
    
  2. 在React函数中 声明

    const dispatch = useDispatch(); // dipatch函数用来发送命令,调用reducers
    const homeData = useSelector((state: any) => state.login.homeData);
    
  3. 直接把 数据绑定在 dom上即可,如果数据更改会自动render

import { useDispatch, useSelector } from 'dva'; // 引入

const Login: React.FC = () => {
  const preState: any = history.location.state ?? {};
  const homeData = useSelector((state: any) => state.login.homeData);
  const dispatch = useDispatch();

  const btnClick = async (from: string) => {
    switch (from) {
      case 'logout':
        dispatch({	// 方法中直接调用 即可
          type: 'login/logoutFetch',
          callback() { 	// callback为回调
            outLogin();
          },
        });

以上就是我公司具体项目上的实践,希望对你有帮助!