Javascript 如何对React JS中嵌套在数组中的对象使用“setState”?
有了它,我就能够在一个简单的对象上成功地使用Javascript 如何对React JS中嵌套在数组中的对象使用“setState”?,javascript,reactjs,setstate,Javascript,Reactjs,Setstate,有了它,我就能够在一个简单的对象上成功地使用setState——当我点击“Joey”时,名称变为“Igor” 尽管我知道这不是setState的工作方式,但我试图通过传递index然后写入this.state.names[index].name:newname来访问name。没什么奇怪的,它没用 我已经研究过了,但找不到类似的问题,尽管我发现有很多关于不变性助手的提到。但我仍然不确定这是否是一条路要走 使用setState修改嵌套在数组中的对象的最佳方法是什么?我将使用以下切换方法: toggl
setState
——当我点击“Joey”时,名称变为“Igor”
尽管我知道这不是setState
的工作方式,但我试图通过传递index
然后写入this.state.names[index].name:newname
来访问name
。没什么奇怪的,它没用
我已经研究过了,但找不到类似的问题,尽管我发现有很多关于不变性助手的提到。但我仍然不确定这是否是一条路要走
使用
setState
修改嵌套在数组中的对象的最佳方法是什么?我将使用以下切换方法:
toggle = (nameYouWantChanged, nameYouWantItChangedTo) => {
this.setState({
names: this.state.names.map(obj =>
obj.name === nameYouWantChanged
? { name: nameYouWantItChangedTo }
: obj
)
})
}
已经修改了代码,可以找到工作示例 可在此处找到更改:
toggle = (index, newname) => {
this.setState((prevState, props) => ({
// Return new array, do not mutate previous state.
names: [
...prevState.names.slice(0, index),
{ name: newname },
...prevState.names.slice(index + 1),
],
}));
}
render() {
const names = this.state.names.map((name, index) => (
// Need to bind the index so callback knows which item needs to be changed.
<Card key={index} change={this.toggle.bind(this, index)} {...name} />
))
return (
<div>
{names}
</div>
);
}
toggle=(索引,新名称)=>{
this.setState((prevState,props)=>({
//返回新数组,不要改变以前的状态。
姓名:[
…prevState.names.slice(0,索引),
{name:newname},
…prevState.names.slice(索引+1),
],
}));
}
render(){
const names=this.state.names.map((名称,索引)=>(
//需要绑定索引,以便回调知道需要更改哪些项。
))
返回(
{names}
);
}
其思想是,您需要通过
.bind
将索引传递到回调函数中,并使用修改后的名称返回一个新的状态
数组。您需要传递索引,以便组件知道要将名称
更改为新名称
this.setState(this.state)
?您如何知道单击了哪个对象?您需要一些标识符,例如特定卡的索引。这非常有用,谢谢Tay。这是可行的,但其他人可能会在以后看到这一点——我在最初的问题中没有提到,出于给出的原因,我希望避免使用.bind(This)
(参见“Way#2”)。在Tay的帮助下,我能够在不使用.bind(This)的情况下重写我的
。谢谢你,布拉德,这很聪明。你在第7行缺少一个)
,应该在:obj
之后,但这是一个很好的解决方案。我修改了我的,以便其他人可以看到这是如何解决问题的。布拉德,还想让你知道,我选择了泰伊的解决方案,而不是你的,因为他使用了索引例如,在数组中的多个对象可能共享同一名称的情况下,可能会出现ps问题。
toggle = (nameYouWantChanged, nameYouWantItChangedTo) => {
this.setState({
names: this.state.names.map(obj =>
obj.name === nameYouWantChanged
? { name: nameYouWantItChangedTo }
: obj
)
})
}
toggle = (index, newname) => {
this.setState((prevState, props) => ({
// Return new array, do not mutate previous state.
names: [
...prevState.names.slice(0, index),
{ name: newname },
...prevState.names.slice(index + 1),
],
}));
}
render() {
const names = this.state.names.map((name, index) => (
// Need to bind the index so callback knows which item needs to be changed.
<Card key={index} change={this.toggle.bind(this, index)} {...name} />
))
return (
<div>
{names}
</div>
);
}