Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在reactjs中更新prevState?_Javascript_Arrays_Reactjs - Fatal编程技术网

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如何批处理状态更新可以使引用
    此。状态
    使状态更新“不正确”。实际上,您可能在设备上看不到它,但可能会导致难以检测的错误?