Javascript 如何在reactjs中更新prevState?
我有一个对象数组的列表。我想更新状态。当我点击数组的第一个项目时,它被赋予Javascript 如何在reactjs中更新prevState?,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,我有一个对象数组的列表。我想更新状态。当我点击数组的第一个项目时,它被赋予isTrue:false,当我点击第二个项目数组时,isTrue被赋予true。当我单击第二个项目数组时,我想得到第一个项目isTrue:true,该数组给出isTrue:true。 我该怎么做 import React,{Component}来自“React”; 从“/Child”导入子项; 导出默认类应用程序扩展组件{ 状态={ 数据:[ {id:“2”,姓名:“约翰”,组织:“组织”}, {id:“1”,名称:“d
isTrue:false
,当我点击第二个项目数组时,isTrue
被赋予true
。当我单击第二个项目数组时,我想得到第一个项目isTrue:true
,该数组给出isTrue:true
。
我该怎么做
import React,{Component}来自“React”;
从“/Child”导入子项;
导出默认类应用程序扩展组件{
状态={
数据:[
{id:“2”,姓名:“约翰”,组织:“组织”},
{id:“1”,名称:“doe”,组织:“组织”}
]
};
handleClick=e=>{
让newData=this.state.data.map(obj=>{
if(obj.id==e.target.id){
返回{…obj,isTrue:!obj.isTrue};
}否则{
返回{…obj,isTrue:false};
}
});
this.setState({data:newData});
};
render(){
返回(
{this.state.data.map(项=>(
))}
{/* */}
);
}
}
您需要多个处于状态的布尔值来管理所有布尔值。将您的数据更新为:
data: [
{ id: "name", name: "ss", org: "s", isTrue: true },
{ id: "nams", name: "ss", org: "s", isTrue: true }
]
然后将名称或id添加到您的li
s
{item.name}
然后更新更改处理程序以更新正确的数据对象
handleClick=(e)=>{
//映射旧数据并返回新对象,这样我们就不会改变状态
让newData=this.state.data.map(obj=>{
//如果ID匹配,则更新该值
if(obj.id==e.target.id){
返回{…obj,isTrue:!obj.isTrue}
}
//否则返回相同的对象
返回obj;
});
//使用新对象更新状态
this.setState({data:newData});
};
您需要多个处于状态的布尔值来管理所有布尔值。将您的数据更新为:
data: [
{ id: "name", name: "ss", org: "s", isTrue: true },
{ id: "nams", name: "ss", org: "s", isTrue: true }
]
然后将名称或id添加到您的li
s
{item.name}
然后更新更改处理程序以更新正确的数据对象
handleClick=(e)=>{
//映射旧数据并返回新对象,这样我们就不会改变状态
让newData=this.state.data.map(obj=>{
//如果ID匹配,则更新该值
if(obj.id==e.target.id){
返回{…obj,isTrue:!obj.isTrue}
}
//否则返回相同的对象
返回obj;
});
//使用新对象更新状态
this.setState({data:newData});
};
这有帮助吗?我尝试了很多方法,但都找不到解决方案。你明白我想得到什么吗?你能通过阅读你的问题陈述来理解你的问题吗?你想通过单击列表项来实现什么?当我单击第二个项时,prevstate将被更改,例如:items:true,items:true这有帮助吗?我尝试了许多方法来解决问题,但找不到解决方案。你明白我想得到什么吗?你能通过阅读你的问题陈述来理解你的问题吗?你想通过单击列表项来实现什么?当我单击第二个项时,prevstate将被更改,例如:items:true,items:true因为此setState依赖于前一个状态,您应该将它放在回调@CameronDowner中。在这种情况下,这无关紧要,因为我们是同步创建新的state对象,然后异步设置它,所以可以避免任何异步冲突。如果我们在setState
中进行了映射,那么应该通过功能更新来完成映射。举例说明:this.setState({data:this.state.map(…)})
。这里的映射实际上是异步执行的,因此数据可能过时,我们应该使用函数更新。但是做let data=this.state.map(…);this.setState({data:data})代码>一旦调用单击处理程序,映射就同步完成,因此数据将是正确的。这并不是说这始终是一种安全的做法,它取决于特定的用例。如果在下一次重新呈现之前(比如说从循环内部)多次调用该处理程序,那么它很容易受到过时数据问题的影响。但对于这样一个简单的处理程序,每个渲染周期只触发一次,这是安全的。可能我遗漏了一些东西,我的理解是ReactJS如何批处理状态更新可以使引用此。状态
使状态更新“不正确”。实际上,您可能在设备上看不到它,但可能会导致难以检测的错误?因为此setState取决于以前的状态,所以您应该将其放在回调@CameronDowner中。在这种情况下,这并不重要,因为我们同步创建新的状态对象,然后异步设置它,因此可以避免任何异步冲突。如果我们在setState
中进行了映射,那么应该通过功能更新来完成映射。举例说明:this.setState({data:this.state.map(…)})
。这里的映射实际上是异步执行的,因此数据可能过时,我们应该使用函数更新。但是做let data=this.state.map(…);this.setState({data:data})代码>一旦调用单击处理程序,映射就同步完成,因此数据将是正确的。这并不是说这始终是一种安全的做法,它取决于特定的用例。如果在下一次重新呈现之前(比如说从循环内部)多次调用该处理程序,那么它很容易受到过时数据问题的影响。但对于这样一个简单的处理程序,每个渲染周期只触发一次,这是安全的。可能我遗漏了一些东西,我的理解是ReactJS如何批处理状态更新可以使引用此。状态
使状态更新“不正确”。实际上,您可能在设备上看不到它,但可能会导致难以检测的错误?