reactjs - 为什么 setState([...arr]) 会导致重新渲染而 setState(arr) 不会?
问题描述
这些不应该做同样的事情吗?第一个代码片段导致我的组件重新呈现
const context = React.useContext(myContext);
const { arr, setArr } = context;
const addItem = (item) => {
arr[0].subArr.push(item);
setArr([...arr]);
}
但这并不
const context = React.useContext(myContext);
const { arr, setArr } = context;
const addItem = (item) => {
arr[0].subArr.push(item);
setArr(arr);
}
setArr 只是从 React.useState() 中提取的,我没有构建任何自定义功能
解决方案
React 只会在其状态(或上下文)中至少有项目发生变化时重新渲染组件。如果所有之前的状态值都===
为新状态,React 将根本不会调用功能组件,而只是继续使用上次渲染的内容。
这是你永远不应该在 React 中改变状态的原因之一——它可能导致意外或不可预测的行为。
在您的情况下,当您这样做时setArr(arr)
,由于 与arr
当前处于状态上下文中的数组完全相同,因此 React 会跳过重新渲染,因为新状态是===
旧状态。只有通过创建一个与当前状态不同的新数组,才会===
发生重新渲染。
推荐阅读
- sql - 如何使用 SQLite 仅将完全匹配的内容插入到列中?
- c# - 在 C# 中使用 powershell 对象检索 cmdlet get-physicaldisk
- c - 在多进程编程中,不同进程之间切换的内容是什么?
- angular - Angular 中新创建的组件缺少页眉和页脚
- inheritance - 使用具有多个模块的模块模式,一个模块中的事件监听器如何使用来自另一个模块的回调?
- django - 多对多关系不适用于我想要的 django-safedelete
- python - python - 从数据框行更新字典中的默认值
- javascript - 带有目录错误的 Nuxt PWA
- html - 姜戈{% 块内容 %}
- kate - 可以更改行距或行高吗?