javascript - React - 更新状态(对象数组)。我需要深度复制数组吗?
问题描述
我有以下内容state
:
const[images,setImages] = useState([
{src: 'stringSRC1', selected: false},
{src: 'stringSRC2', selected: false},
{src: 'stringSRC3', selected: false}
]);
我正在使用以下代码更新它(切换选定状态):
function handleImageClick(index) {
props.setImages((prevState)=>{
const aux = Array.from(prevState);
aux[index].selected = !aux[index].selected;
return aux;
});
}
它按预期工作。但我想到了一件事。
当我从 复制数组时prevState
,我正在创建一个新数组,但对象(存储为引用)将保持不变。我已经测试过,当你像这样复制数组时它们不会改变。
问题
这是一个不好的做法吗?我是否应该费心深度复制数组,例如创建一个新数组并创建全新的对象?或者这很好?
解决方案
TL;DR - 您仍然需要制作深层副本。
官方文档建议制作深拷贝:
State 可以保存任何类型的 JavaScript 值,包括对象。但是你不应该直接改变你在 React 状态下持有的对象。相反,当您想要更新一个对象时,您需要创建一个新对象(或复制现有对象),然后将状态设置为使用该副本。
他们还建议使您的状态对象尽可能平坦,以使深度复制更容易,如果这不是一个选项,请使用immer之类的东西来为您处理深度复制。
如果您的状态嵌套很深,您可能需要考虑将其展平。但是,如果您不想更改您的状态结构,您可能更喜欢嵌套传播的快捷方式。Immer 是一个流行的库,可让您使用方便但可变的语法进行编写,并负责为您生成副本。
推荐阅读
- sql - 将数量拆分为多行,每行数量有限制
- python - scipy中的假设检验
- azure - 在 Azure DevOps 自定义代理池中哪里可以找到工件
- scala - 仅使用一台计算机/节点时,分区会提高性能吗?
- python-3.x - Python if 语句获取最新值
- python - 用指定的均值或 sigma 拟合拉普拉斯分布
- python - 在 Heroku 上推送 Flask Web App 时出错-“请求的运行时不适用于此堆栈 (heroku-18)。”
- astropy - 从多个数字的 Photutils DAOStarFinder 表中排序相同的星
- python - 使用 put() 创建实体时的数据存储延迟
- python - 过滤具有冲突角色的员工数据框