index.ts

1 const store = {
2 state: {
3 num: 20,
4 },
5 actions: {
6 // 放同步的代码
7 add1(newState: { num: number }, action: { type: string }) {
8 // redux 异步写法有问题
9 // setTimeout(() => {
10 // newState.num++;
11 // }, 500);
12 newState.num++;
13 },
14 add2(newState: { num: number }, action: { type: string; value: number }) {
15 newState.num += action.value;
16 },
17 add3(newState: { num: number }, action: { type: string; value: number }) {
18 newState.num += action.value;
19 },
20 },
21 // 优化redux-thunk的异步写法 (模仿vuex)
22 asyncActions: {
23 asyncAdd1(dispatch: Function) {
24 setTimeout(() => {
25 dispatch({ type: "add1" });
26 }, 1000);
27 },
28 },
29
30 // 1 初始写法
31 // add1: "add1",
32 // add2: "add2",
33 // 2 名字同一管理
34 // actionNames: {
35 // add1: "add1",
36 // add2: "add2",
37 // },
38 // 3 优化
39 actionNames: {},
40 };
41 // 我们现在想做到actionNames自动生成。不用我每一次添加一个方法,
42 // 都要在actionNames手动添加键值对,这样很麻烦。
43
44 let actionNames = {};
45 /**
46 * actionNames有多少个键值对,取决于actions里有多少个函数,
47 * 遍历store.actions,给actionNames添加键值对
48 */
49 for (let key in store.actions) {
50 actionNames[key] = key;
51 }
52 store.actionNames = actionNames;
53
54 export default store;
55 // 封装的目的:最终是有利于我们的开发或者维护
56 // 封装的思路是:将来开发的时候只需要把数据写和方法写入到这个
57 // 状态文件中,例如:XxxxStatus/index.ts,而不需要再去操作其
58 // 他的文件。(我们往这个方向去封装)
reducer.ts:

import handleNum from "./index";
// 管理数据
// const defaultState = {
// // num: 20,
// // num: Numstatus.state.num // 数据一多要写很多次
// ...handleNum.state // 解构的写法
// }; let reducer = (
state = { ...handleNum.state }, // 直接解构
action: { type: string; value: number }
) => {
// 调用dispatch就会执行这里的代码
// console.log("初始化执行了reducer....");
// 深度复制
let newState = JSON.parse(JSON.stringify(state)); // switch的做法是拿action.type和case后面的每一个值进行对比,进行遍历
// 把case后面的值做成对象,actionsNames
// 1 原始写法
// switch (action.type) {
// case handleNum.add1:
// handleNum.actions[handleNum.add1](newState,action)
// break;
// case handleNum.add2:
// handleNum.actions[handleNum.add2](newState,action)
// break;
// default:
// break;
// }
// 2 [优化],上面的写法,我们在每添加一个方法,都要多写一个case
// 拿action.type和actionsNames每一个项进行对比,如果相等,就调用
// 模块名 actions[下标](newState,action) for (let key in handleNum.actionNames) {
// key 是每一个键
// 判断是否相等
// if (action.type === "add1") {
if (action.type === handleNum.actionNames[key]) {
handleNum.actions[handleNum.actionNames[key]](newState, action);
break;
}
}
// 好处:每一次写一个方法,都不需要手动添加case
return newState;
}; export default reducer;

  

react项目--redux封装的更多相关文章

  1. 如何在非 React 项目中使用 Redux

    本文作者:胡子大哈 原文链接:https://scriptoj.com/topic/178/如何在非-react-项目中使用-redux 转载请注明出处,保留原文链接和作者信息. 目录 1.前言 2. ...

  2. 如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...

  3. 教你如何在React及Redux项目中进行服务端渲染

    服务端渲染(SSR: Server Side Rendering)在React项目中有着广泛的应用场景 基于React虚拟DOM的特性,在浏览器端和服务端我们可以实现同构(可以使用同一份代码来实现多端 ...

  4. 在react项目当中使用redux

    如果需要在你的react项目当中使用状态管理模式的话,需要引入redux和react-redux两个插件,redux提供基本的功能,react-redux提供将redux注入react的方法. imp ...

  5. 优雅的在React项目中使用Redux

    概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在 ...

  6. 在react项目中使用redux or mobx?

    主要比较参数: 库体积,打包项目体积 开发体验 性能对比 在对比参数前首先分析一下redux和mobx的设计模式,redux和mobx都没有使用传统的mvc/mvvm形式,而且他们使用flux结构也略 ...

  7. React项目使用Redux

    ⒈创建React项目 初始化一个React项目(TypeScript环境) ⒉React集成React-Router React项目使用React-Router ⒊React集成Redux Redux ...

  8. 解决react项目中跨域和axios封装使用

    最新几天学了一下react,发现了几个问题,估计新入坑的同学们也会遇到,下面我先列出来几点 1.请求跨域问题 2.如何发起请求 3.axios的简单封装 全局安装create-react-app脚手架 ...

  9. redux在react项目中的应用

    今天想跟大家分享一下redux在react项目中的简单使用 1 1.redux使用相关的安装 yarn add redux yarn add react-redux(连接react和redux) 2. ...

  10. react项目中引入了redux后js控制路由跳转方案

    如果你的项目中并没有用到redux,那本文你可以忽略 问题引入 纯粹的单页面react应用中,通过this.props.history.push('/list')就可以进行路由跳转,但是加上了redu ...

随机推荐

  1. 使用VMware Converter Standalone P2V(物理机转换虚拟机)

    使用VMware Converter Standalone P2V(物理机转换虚拟机) 环境说明: 1.P2V软件:VMware-converter-en-6.3.0-20575345  下载地址:v ...

  2. Node.js学习笔记----day05(在Node中操作MySQL)

    认真学习,认真记录,每天都要有进步呀!!! 加油叭!!! 一.安装 初始化项目 安装mysql(这里的mysql是node用来操作mysql的一个第三方包,包的名字就叫mysql) 安装mysql包的 ...

  3. 日志添加request-id

    package com.xf.config; import java.util.Date; import javax.servlet.http.HttpServletRequest; import j ...

  4. Java堆外缓存(一个很有意思的应用)

    我们在开发过程中会遇到这样的场景:就是一个服务的各项 JVM 的配置都比较合理的情况下,它的 GC 情况还是不容乐观.分析之后发现有 2 个对象特别巨大,占了总存活堆内存的 90%以上.其中第 1 大 ...

  5. Quartz与Topshelf结合实现window定时服务

    一,新建控制台应用程序 二,选中项目,右键 - 管理 NuGet 程序包,添加四个: Quartz Quartz.Plugins Topshelf log4net 三,创建项目文件 三个配置文件:必须 ...

  6. Spring框架-AOP核心

    Spring AOP AOP (Aspect Oriented Programming) 面向切面编程 OOP(Object Oriented Programming)面向对象编程,用对象的思想来完善 ...

  7. 【GDKOI 2021提高组DAY2】抄写

    \(\text{Solution}\) \(dp\) 翻折就只需预处理回文中心 \(Manacher\) 预处理即可 \(Code\) #include<cstdio> #include& ...

  8. TrueNAS安装 一个厉害的nas系统

    转载: 戴俊财--个人学习网站 https://www.daijuncai.cn/?p=128

  9. uWSGI 结合 nginx 配置动静分离

    uWSGI 结合 nginx 配置动静分离 目录 uWSGI 结合 nginx 配置动静分离 1 环境准备 2 初始配置文件 2.1 uwsgi 配置文件 2.2 Nginx配置文件 2.3 Djan ...

  10. .Net 6 使用Log4Net

    1.首先引入Log4Net的 Nuget包   第一个就是 2.复制所需配置文件(文件中包含写入文本日志和数据库日志, 自行根据注释选择所需) 取名   log4net.Config <?xml ...