Reactjs React中对象数组的设置状态
好的,所以我很沮丧找到正确的解决方案,所以我把问题贴在这里。给我一个答案会帮我很多,因为我被卡住了 状态树如下所示Reactjs React中对象数组的设置状态,reactjs,immutability,setstate,Reactjs,Immutability,Setstate,好的,所以我很沮丧找到正确的解决方案,所以我把问题贴在这里。给我一个答案会帮我很多,因为我被卡住了 状态树如下所示 this.state = { itemList : [{ _id : 1234, description : 'This the description', amount : 100 }, {
this.state = {
itemList : [{
_id : 1234,
description : 'This the description',
amount : 100
}, {
_id : 1234,
description : 'This the description',
amount : 100
}],
}
问题是:
唯一的方法是复制itemList,修改它,并将状态设置为它
update() {
let itemList = this.state.itemList.slice();
//update it
this.setState({ itemList });
}
要更新这样构造的状态,必须找到要更新的元素的索引,复制数组并更改找到的索引 如果将记录列表作为对象,以id作为键,以记录作为值,则更容易阅读。于2018年3月25日回答 这就是如何使用setState和prevstate更新数据结构中对象的特定属性
this.setState(prevState => ({
itemList: prevState.itemList.map(
obj => (obj._id === 1234 ? Object.assign(obj, { description: "New Description" }) : obj)
)
}));
2019年12月12日答复(REACT HOOKS)
import React,{useState}来自“React”;
常量应用=()=>{
const[data,setData]=useState([
{
用户名:“141451”,
密码:“password”,
最喜欢的食物:“披萨”,
},
{
用户名:“15151”,
密码:“91jf7jn38f8jn3”,
最喜欢的食物:“豆子”
}
]);
返回(
{data.map(用户=>{
返回(
{
setData([…data].map(对象=>{
if(object.username==user.username){
返回{
对象
最喜欢的食物:“土豆”,
someNewRandomAttribute:'X'
}
}
否则返回对象;
}))
}}>
{JSON.stringify(用户)+'\n'}
)
})}
)
}
将数据更新到对象数组中的最佳方法
onChange={(e)=>this.setState({formData:{…this.state.formData,'plan_id':e.target.value}})}
let itemList=this.state.itemList代码>。如果在此之后修改itemList
,则是在改变状态。切分时不是这样。@DragoşPaulMarinescu你错了,切分创建了一个副本。因为文章经过编辑,很明显我的评论引用了初始代码。@DragoşPaulMarinescu没有看到编辑,刚才有没有想过如何迭代所有对象?如果你在应用程序中使用lodash或ramda,你可以使用它,也可以使用Object.keys()。我通常使用redux来保存这样的数据,并使用reselect,所以我的选择器返回arrays@Omar我需要更新数组中的整个对象??然后只需执行const updatedValues=array.map(item=>{return{…item,updatedKey:'value'}})Object.assign(obj
变异当前状态对象,该对象是React中的反模式。对象。赋值({},obj
将正确创建新对象。
import React, { useState } from 'react';
const App = () => {
const [data, setData] = useState([
{
username: '141451',
password: 'password',
favoriteFood: 'pizza',
},
{
username: '15151',
password: '91jf7jn38f8jn3',
favoriteFood: 'beans'
}
]);
return (
<div>
{data.map(user => {
return (
<div onClick={() => {
setData([...data].map(object => {
if(object.username === user.username) {
return {
...object,
favoriteFood: 'Potatos',
someNewRandomAttribute: 'X'
}
}
else return object;
}))
}}>
{JSON.stringify(user) + '\n'}
</div>
)
})}
</div>
)
}