第46节——redux中使用不可变数据+封装immer中间件——了解

一、为什么redux中要使用不可变数据

Redux 要求使用不可变数据,是因为它遵循了函数式编程的原则。在函数式编程中,数据不可变是一项重要的原则,这有助于避免状态更改产生的不可预知的副作用。

在 Redux 中,每当 action 被分发,reducer 都会接收到当前的状态和 action,并返回一个新的状态。如果使用的是可变数据类型,并且在 reducer 中直接对状态进行修改,就会造成状态的不可预知的更改。

因此,Redux 要求使用不可变数据,是为了更好地管理应用状态,以及提高代码的可读性和可维护性

二、在redux中使用immer

jsx 复制代码
import produce from "immer";
const defaultState = {
  name: "张三",
};

const userReducer = (state = defaultState, action) => {
  console.log(action);
  switch (action.type) {
    case "UPDATE_USER_NAME":
      return produce(state, (draft) => {
        draft.name = action.name;
      });
    default:
      return state;
  }
};

export default userReducer;

四、applyMiddleware

1、概念

applyMiddleware 是 Redux 的一个高阶函数,用于向 Redux Store 应用中间件。

中间件是一个函数,它可以在 dispatch 操作执行前后,对 action 进行拦截、处理、修改等操作。例如:日志记录、错误捕获、异步请求、数据缓存等等。

使用 applyMiddleware,你可以实现额外的功能,并且可以在不修改原始代码的情况下对其进行扩展。

2、例子

jsx 复制代码
import { createStore, applyMiddleware } from 'redux'
// 日志插件
import logger from 'redux-logger'
import rootReducer from './reducers'

// 直接使用日志插件
const store = createStore(rootReducer, applyMiddleware(logger))

五、进阶------使用immer封装一个redux的中间件,让所有的修改数据都是以不可变数据的方式进行修改

1、创建一个immerMiddleware.js文件

jsx 复制代码
import { produce } from 'immer';

// 定义immerMiddleware中间件

/**
 * 
 * store createStore后返回的store,可以使用他的任何方法
 * next 
 * @returns 
 */
const immerMiddleware = store => next => action => {
  // 使用immer的produce函数生成新的state
  const newState = produce(store.getState(), draft => {
    /**
     * next可以调用对应的action里面的reducer
     * 并且可以拿到reducer返回的结果
     * 我们把返回的结果给draft赋值
     */
    draft = next(action);
  });

  // 返回新的state
  return newState;
};

export default immerMiddleware;

2、使用

jsx 复制代码
import { createStore, applyMiddleware } from 'redux'

import immerMiddleware from './plugin/immerMiddleware'
import rootReducer from './reducers'

const store = createStore(rootReducer, applyMiddleware(immerMiddleware))

当我们在修改数据的时候就不需要再考虑不可变数据的问题了,因为immer已经统一帮我们处理了

相关推荐
爱吃烤鸡翅的酸菜鱼17 小时前
Maven中BOM(Bill of Materials)的使用详解
java·中间件·maven·源代码管理
MY_TEUCK2 天前
【MY_TRUCK中间件实战】Redis 入门教程:从基础命令到 Spring Boot 实战
spring boot·redis·中间件
ILYT NCTR2 天前
SocketTool、串口调试助手、MQTT中间件基础
单片机·嵌入式硬件·中间件
小李云雾5 天前
FastAPI重要知识点---中间件(Middleware)
学习·程序人生·中间件·fastapi·middleware
fuquxiaoguang6 天前
住房公积金数字化建设中的四层思考:以江苏实践为例
中间件·自主可控·公积金平台·协通伟业
是小蟹呀^6 天前
【总结】LangChain中的中间件Middleware
python·中间件·langchain·agent
fuquxiaoguang7 天前
从47个接口到全栈适配:医疗信创的“重建”之路
中间件·医疗·金蝶天燕
Dontla7 天前
Audit Log(审计日志)介绍(对系统中关键操作行为记录,用户行为+系统变更+安全事件)中间件 / AOP、数据库层——数据库变更捕获(CDC)
数据库·中间件
8Qi88 天前
Elasticsearch 初识篇:核心概念与环境搭建
java·大数据·分布式·elasticsearch·搜索引擎·中间件
van久8 天前
Day15-5:中间件 封装为 扩展方法
中间件