使用useReducer抽离方法管理状态

本文介绍了如何在React中使用Hooks和ContextAPI实现组件间的状态共享,包括创建`ReportContext`、`ReportProvider`以及如何在组件中使用`useReportContext`和处理动作(ACTIONS)来管理状态。
摘要由CSDN通过智能技术生成

hooks文件

import React, { createContext, useReducer, useContext, useEffect, useState } from 'react';

import { ACTIONS } from './actions';

import reducer from './reducer';

const ReportContext = createContext({});

const ReportProvider = ({ children }) => {

  const [state, dispatch] = useReducer(reducer, {

初始化定义需要使用的变量

  });

  const value = { state, dispatch };

  return <ReportContext.Provider value={value}>{children}</ReportContext.Provider>;

};

const useReportContext = () => useContext(ReportContext);

export { ACTIONS, ReportProvider, useReportContext };

actions文件类容

export const ACTIONS = {
  SET_IDS: 'set_ids',
  SET_DATASOURCE_TYPE: 'set_datasource_type',
  SET_DATASOURCE_MENU: 'set_datasource_menu',
  SET_REPORT_DATA: 'set_report_data',
  SET_TOP_VALUES: 'setTopValues',
};

reducer文件类容

import { ACTIONS } from './actions';

/** 设置对比任务ID */
const setIds = (state, payload) => {
  return {
    ...state,
    ids: payload,
  };
};

/** 设置选中的数据源 */
const setDatasourceType = (state, payload) => {
  return {
    ...state,
    datasourceType: payload,
  };
};

/** 设置数据源Tab */
const setDatasourceMenu = (state, payload) => {
  return {
    ...state,
    datasourceMenu: payload,
  };
};

/** 设置报表数据对象,以洞察任务ID为key */
const setReportData = (state, payload) => {
  return {
    ...state,
    reportData: payload,
  };
};


// 管理所有处理函数
const handlerMap = {
  [ACTIONS.SET_IDS]: setIds,
  [ACTIONS.SET_DATASOURCE_TYPE]: setDatasourceType,
  [ACTIONS.SET_DATASOURCE_MENU]: setDatasourceMenu,
  [ACTIONS.SET_REPORT_DATA]: setReportData,
};

const reducer = (state, action) => {
  const { type, payload } = action;
  const handler = handlerMap[type];
  const res = typeof handler === 'function' && handler(state, payload);
  return res || state;
};

export default reducer;

在这里统一管理他们的状态逻辑

使用的时候把文件引入进去把这个ReportProvider包裹在你需要使用的模块组件最外层

然后在里面引入useReportContext就可以使用了


  const {

    state

    dispatch,

  } = useReportContext();

比如

   dispatch({

        type: ACTIONS.SET_IDS,

        payload: value,

      });

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在后台管理系统中,mixins可以用来抽离一些通用的逻辑和功能,以便在多个组件中共享和复用。以下是一些常见的需要抽离的内容: 1. 权限控制:后台管理系统通常需要进行权限控制,例如根据用户角色显示不同的菜单或页面。可以将权限控制的逻辑抽离到mixins中,然后在需要进行权限控制的组件中引入并使用。 2. 表单验证:后台管理系统中的表单通常需要进行一些验证,例如验证输入是否为空、验证邮箱格式等。可以将表单验证的逻辑抽离到mixins中,然后在需要进行表单验证的组件中引入并使用。 3. 数据请求:后台管理系统中经常需要进行数据请求,可以将数据请求的逻辑抽离到mixins中,然后在需要进行数据请求的组件中引入并使用。 4. 全局状态管理:后台管理系统中可能需要使用全局状态管理管理一些共享的数据,例如用户信息、系统配置等。可以将全局状态管理的逻辑抽离到mixins中,然后在需要使用全局状态的组件中引入并使用。 5. 样式和主题:后台管理系统通常需要进行样式和主题的定制,可以将样式和主题相关的逻辑抽离到mixins中,然后在需要进行样式和主题定制的组件中引入并使用。 通过使用mixins,可以将这些通用的逻辑和功能抽离出来,提高代码的复用性和可维护性,同时也可以减少代码的冗余。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值