reactjs - useState 和 useImmer 有什么区别?

标签 reactjs react-hooks react-state-management immer.js

我见过一些 React 应用程序使用 useImmer 作为 Hook 而不是 useState .我不明白什么useImmer提供 useState才不是。

使用 useImmer 有什么好处?过度使用官方useState ?

最佳答案

简而言之, immer 有助于您改变嵌套/复杂数据结构的方式。看看这2种方式:
考虑以下对象:

const [product, updateProduct] = useState({
    name: "Product 1",
    SKU: "SKU-001",
    availability: 30,
    stock: [
      {
        id: 1, 
        store: "Store 1",
        quantity: 10
      },
      {
        id: 2, 
        store: "Store 2",
        quantity: 20
      }
    ]
  });
为了操作它,您应该传递整个对象并覆盖您想要更新/更改的属性:
updateProduct({ ...product, name: "Product 1 - Updated" })
但是,如果您使用“useImmer”,您可以发送您想要更改的唯一部分,而 immer 本身将处理引擎盖下的其余部分。
  const [product, updateProduct] = useImmer({
    name: "Product 1",
    SKU: "SKU-001",
    availability: 30,
    stock: [
      {
        id: 1, 
        store: "Store 1",
        quantity: 10
      },
      {
        id: 2, 
        store: "Store 2",
        quantity: 20
      }
    ]
  });
所以要更新:
updateProduct((draft) => { 
   draft.name = "Product Updated" };
})
当您处理复杂的结构时它确实更有意义,假设您想更改“Stock”数组中的第二个对象,那么您可以使用:
updateProduct((draft) => {
    draft.stock[1].quantity = 30;
})

关于reactjs - useState 和 useImmer 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61669930/

相关文章:

javascript - react Hook 。单击时如何使其他项目(当前项目除外)停用

javascript - 使用占位符信息正确构造数组,直到填充所选对象

javascript - 将 react Hook 设置为导致循环的数组

reactjs - Next.js - useEffect 甚至不执行一次

reactjs - React Hook 在状态更改后不会重新渲染 array.map

javascript - 如何动态获取状态数组名称 React

javascript - 如何在 ReactJs 中动态改变元素的位置?

javascript - REACT-显示我的 json 文件的内容但只获取标题

javascript - 中间组件逻辑仅在 React 中应用一次

reactjs - 组件在异步 React 上下文更新时渲染两次