immer:优雅操作react数据状态,告别繁琐克隆拷贝

简介: immer:优雅操作react数据状态,告别繁琐克隆拷贝

前言

Immer 是一个用于简化 JavaScript 状态管理的库,以更方便地更新和操作不可变数据

可以解决以下问题:


  1. 不可变状态更新:React 推崇使用不可变(Immutable)的数据来管理组件的状态。

【Immutable 不可变对象】
不直接修改状态或属性对象,而是创建新的对象来代表改变后的状态。

Immer 使得在 React 中使用不可变数据更加容易,通过提供简洁的 API 和直观的语法,以可变的方式更新不可变数据。

  1. 状态更新的简洁性:React 的传统方式是通过使用 setState 方法更新状态,需要手动创建新的状态对象或数组,并进行深度克隆。而使用 Immer,可以通过直接在原始状态上进行修改,以一种可变的方式更新状态。


React 中使用 Immer ,可以避免手动编写深度克隆、合并对象或数组的代码,同时还能保持数据的不可变性,方便进行状态管理和追踪变更。


react组件使用immer

以下是一个使用 Immer 的 React 组件示例:


import React from 'react';
import { produce } from 'immer';
class Counter extends React.Component {
  state = {
    count: 0
  };
  increment = () => {
    this.setState(produce((draft) => {
      draft.count += 1;
    }));
  };
  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.increment}>Increment</button>
      </div>
    );
  }
}
export default Counter;


在上面的示例中,我们使用 produce 函数将状态更新的逻辑放在一个回调函数中,然后将回调函数传递给 setState。Immer 会在回调函数中提供一个名为 draft 的草稿对象,

我们可以直接对该对象进行更改,而不用担心原始对象被修改。Immer 会根据我们的更改生成一个新的不可变对象,并将其作为新的状态进行更新。

redux中使用immer

接下来,让我们看一个使用 Immer 结合 Redux 的示例:


import { createStore } from 'redux';
import produce from 'immer';
// 初始状态
const initialState = {
  count: 0
};
// reducer
const reducer = (state = initialState, action) => {
  return produce(state, (draft) => {
    switch (action.type) {
      case 'INCREMENT':
        draft.count += 1;
        break;
      case 'DECREMENT':
        draft.count -= 1;
        break;
      default:
        break;
    }
  });
};
// 创建 store
const store = createStore(reducer);
export default store;


在上面的示例中,我们在 Redux 的 reducer 中使用 produce 函数来更改状态。它接收当前状态 state 和表示要进行的更改操作的回调函数。我们可以在回调函数中对 draft 对象进行更改,Immer 会自动处理状态的更新。

总结

在使用 React 组件时,可以使用 produce 函数来更新状态,而在使用 Redux 时,可以在 reducer 中使用 produce 函数来进行状态更改操作。这样可以避免手动编写不必要的克隆和合并代码,并且使我们的代码更容易理解和维护。

相关文章
|
18天前
|
存储 前端开发 JavaScript
React中有效地使用props和state来管理组件的数据和行为
React中有效地使用props和state来管理组件的数据和行为
|
25天前
|
前端开发
react通过上下文深入传递数据
react通过上下文深入传递数据
|
1月前
|
前端开发
掌握React中的useContext:访问父组件数据的神奇技巧
掌握React中的useContext:访问父组件数据的神奇技巧
|
1月前
|
前端开发 JavaScript 开发者
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件(二)
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件
32 0
|
1月前
|
JavaScript 前端开发 算法
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件(一)
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件
33 0
|
1月前
|
前端开发
React组件通信:如何优雅地实现组件间的数据传递
React组件通信:如何优雅地实现组件间的数据传递
54 0
|
1月前
|
数据可视化 前端开发 JavaScript
react+datav+echarts实现可视化数据大屏
最近有点闲,就学习了下react,没想到就把react学完了,觉得还不错,就打算出一把react+datav的简易版可视化数据大屏供大家做个参考
250 2
react+datav+echarts实现可视化数据大屏
|
1月前
|
前端开发
基础react加一减一操作
基础react加一减一操作
|
1月前
|
前端开发
react 使用 antd-mobile组件库实现下滑加载数据
react 使用 antd-mobile组件库实现下滑加载数据
|
1月前
|
前端开发 调度
高端操作:把 React Scheduler 掏出来单独用
高端操作:把 React Scheduler 掏出来单独用