我正在尝试更改应用程序的状态,而不会覆盖未更改的值。我正在使用传播运算符这样做,但是出了点问题。
这是我的基本状态:useState({data : [{name : undefined , project : []}] });
我想用setState
仅添加名称,但不要更改项目数组,因为它没有变化。
setManager(prevState => ({...prevState , data : res.data}))
执行setState之后,新状态如下:
[
{name: "John doe"},
{name: "Jane Doe"}
]
如您所见,默认状态被完全覆盖。
res.data看起来像这样:
[
{name: "john doe"},
{name: "jane doe"}
]
答案 0 :(得分:1)
通过setManager(prevState => ({...prevState , data : res.data}))
,您只是覆盖了您较早的'main'data
属性。
data
是一个数组,新值在数组中...只需concat
它们
setManager(prevState => ({...prevState ,
data : prevState.data.concat( res.data )
}))
那之后你应该拥有
[
{name: undefined , project : []},
{name: "john doe"},
{name: "jane doe"}
]
...但是您可能想单独管理名称和项目:
const [manager, setManager] = useState({
data: {
name: undefined,
project: []
}
});
...甚至
const [manager, setManager] = useState({
name: undefined,
project: []
});
通过这种方式,您无需使用“中介” .data
“寻址”此数据
<Component names={manager.name} />
...不是{manager.data.name}
。
当然,仅更新name
需要不同的代码
setManager(prevState => ({
...prevState,
name : prevState.name.concat( res.data )
}))
...prevState
禁止删除project
属性name
应该用[]
而不是undefined
初始化 如果您有单独的状态“切片”,则无需使用一个公共状态,请使用许多useState
声明。
答案 1 :(得分:1)
可能您需要的是:
const [manager, setManager] = useState({
data: [{ name: undefined, project: [] }]
});
setManager(prevState => ({
data: prevState.data.map((item, index) => ({ ...item, ...res.data[index] }))
}));
但是,如果您只是存储“项目”数组,那么您的状态应该更像:
const [manager, setManager] = useState([{ name: undefined, project: [] }]);
setManager(prevState =>
prevState.data.map((item, index) => ({ ...item, ...res.data[index] }))
);
此外,您如何合并上一个和传入的数据取决于很多事情,也许您需要一些更复杂的状态存储方式。
答案 2 :(得分:1)
您使用数组(而不是对象)来初始化状态,这就是行为的原因。
更改为
useState({data : [{name : undefined , project : []}] });
到
useState({data : {name : undefined , project : []} });