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


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

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

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

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

    二、在redux中使用immer

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    四、applyMiddleware

    1、概念

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

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

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

    2、例子

    import { createStore, applyMiddleware } from 'redux'
    // 日志插件
    import logger from 'redux-logger'
    import rootReducer from './reducers'
    
    // 直接使用日志插件
    const store = createStore(rootReducer, applyMiddleware(logger))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    1、创建一个immerMiddleware.js文件

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2、使用

    import { createStore, applyMiddleware } from 'redux'
    
    import immerMiddleware from './plugin/immerMiddleware'
    import rootReducer from './reducers'
    
    const store = createStore(rootReducer, applyMiddleware(immerMiddleware))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

  • 相关阅读:
    基于51单片机直流电机PWM控制器设计
    全网最全:Mysql六种约束详解
    圣庭医疗联合创始人谷红仓:高通量基因测序在药物研发和靶向治疗中的应用
    win10安装wget,从此可以更快的下载文件 and windows10 下 zip命令行参数详解
    有哪些可以免费下载视频剪辑素材的网站?
    axios封装get,post请求, 原生xhr ajax封装同步请求
    Windows下安装Anaconda5.3.1+Python3.8+TensorFlow2.13.0-CPU版本总结
    TS:知识补充
    力扣18-四数之和——双指针法
    组原必备知识点
  • 原文地址:https://blog.csdn.net/weixin_57017198/article/details/133443426