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. Ribbon负载均衡 (源码分析)

    Ribbon负载均衡 SpringCloud已经删除了ribbon组件,所以需要手动导入依赖.(要学是因为很多项目业务已经使用了ribbon) 服务拉取的时候添加了@LoadBalanced注解,实现 ...

  2. TypeScript 学习笔记 — 类的基本用法(五)

    目录 TS 中定义类 类中实例属性.方法 + 修饰符 public protected private readonly 实例方法 类中原型属性.方法 + 访问器 原型属性 + 访问器 原型方法 类中 ...

  3. JZOJ 2022.02.11【提高A组】模拟

    \(\text{Solution}\) 首先把 \(T2\) 给切了,\(T1\) 找半天规律找不到 然后打了个表算是暴力了 \(T3\) 也暴... 太暴了... \(T4\) 直接啥也不会 \(\ ...

  4. Sonarqube安装(Docker)

    一,拉取相关镜像并运行 # 拉取sonarqube镜像 docker pull sonarqube:9.1.0-community 在运行之前要提前安装postgres并允许,新建数据库名为sonar ...

  5. 07#Web 实战:仿 GitHub 个人主页项目拖拽排序

    实现效果图 GitHub 和 Gitee 个人主页中可以对自己的项目进行拖拽排序,于是我就想自己实现一个.本随笔只是记录一下大概的实现思路,如果感兴趣的小伙伴可以通过代码和本随笔的说明去理解实现过程. ...

  6. PostgreSQL 实现快速删除一个用户

    一.具体方法 一般情况下直接执行 drop role xxx; 就可以把这个用户删除.但是很多时候会因为用户有依赖而报错. 二.权限依赖 postgres=# create role test wit ...

  7. 自己动手从零写桌面操作系统GrapeOS系列教程——6.电脑启动过程介绍

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 按一下电脑上的电源按钮,电脑就启动了,不一会儿电脑屏幕上就出现了登录界面或直接进入了桌面. 这是一个很日常的场景,但有时候会有个疑问:电脑内部是 ...

  8. 3.基于Label studio的训练数据标注指南:文本分类任务

    文本分类任务Label Studio使用指南 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取).文本分类等 2.基于Label studio的训练数据标注指南:(智能文档) ...

  9. 一键接入 ChatGPT,让你的QQ群变得热闹起来

    目录 项目效果 安装环境 配置文件 启动Mirai 启动ChatGPT 项目效果 ChatGPT 的出现对于人们的生活和工作都有着重要的影响,作为一个强大的自然语言处理模型,可以理解和生成自然语言,所 ...

  10. npm -D与-S

    --save == -S -S, --save 安装包信息将加入到dependencies(生产阶段的依赖,也就是项目运行时的依赖,就是程序上线后仍然需要依赖) --save-dev == -D -D ...