reactjs - 如何在不复制的情况下更改对象状态
问题描述
我有一个产品状态对象,它只是为了方便前端,我想减少一个字段,但是当我这样做时,它会创建对象的副本而不是改变实际的对象。什么是 React-y 方法来操作没有重复的字段?
我的下载功能:
const getDownload = async (id, uid, bucket_prefix, variation) => {
const getPresignedUrl = functions.httpsCallable('getPresignedUrl')
await getPresignedUrl({id: id, uid: uid, bucket_prefix: bucket_prefix ? bucket_prefix : '', variation: variation})
.then(res => {
if (Object.keys(res.data).length > 0) window.open(res.data, '_blank')
const intendedObj = ownedProds[id]
setOwnedProds({
...ownedProds,
})
})
.catch(err => console.error(err))
}
的形状ownedProds
:
ownedProds = {
{id}:
{
uid:
id:
downloads_remaining:
...
}
}
}
我基本上想ownedProds[id]
在我的 setState 中定位,并且只是减少ownedProds[id].downloads_remaining
一个。我可以做到,但它只是添加了另一个与对象中的键具有相同 ID 的对象。
我可以将 getData 移到 useEffect 之外,然后再次调用它,但随后它再次 ping 我的服务器并重新获取所有数据,并且顺序变得混乱,所以有一个转变,这是一个 PITA 对对象进行排序只是因为我想要改变状态对象中一个对象的一个属性。我是不是很傻?我应该再次致电服务器以获得多余的号码吗?
解决方案
您可以通过将函数传递给 setState 来实现。该函数将接收先前的值,并返回一个更新的值。所以根据你想做的事情,这样的事情应该可以工作:
setOwnedProds(ownedProds => {
ownedProds[id].downloads_remaining--;
// Or any other state manipulation you want to achieve.
return ownedProds;
});
推荐阅读
- c# - 如何在 UWP C# 中将协议激活链接复制到剪贴板
- javascript - 如何使用javascript过滤陀螺仪的噪声
- regex - 正则表达式在 URL 的动态部分之后排除结果
- assembly - 装配中的链表节点(炸弹实验室第 6 阶段)
- java - 我有 Java rest api 异常 java.lang.IllegalArgumentException
- javascript - 列中的百分比值给出 Nan 和无穷大
- hive - 从存储为 Hive 中的字符串的 JSON 对象替换特定元素
- jquery - jQuery响应中的鼠标悬停事件
- r - 在 dplyr::group_by 之后和 prcomp 之前删除等方差的列
- c++ - 附加到双向链表并显示