Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.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 通过两个for循环设置状态_Javascript_Reactjs - Fatal编程技术网

Javascript 通过两个for循环设置状态

Javascript 通过两个for循环设置状态,javascript,reactjs,Javascript,Reactjs,我想设置一个对象数组的状态,它的一个键/属性是通过两个for循环的数组 我一直在尝试几种解决方案(没有一种对我有效),下面就是其中之一。如果我移动var secondArr=[]在循环中,所有用户的整个文件都会转到每个用户 state = { users: [ index: "", firstName: "", files: [], ]; } handleDate = async () => { var first

我想设置一个对象数组的状态,它的一个键/属性是通过两个for循环的数组

我一直在尝试几种解决方案(没有一种对我有效),下面就是其中之一。如果我移动
var secondArr=[]在循环中,所有用户的整个文件都会转到每个用户

state = {
    users: [
        index: "",
        firstName: "",
        files: [],

    ];
}

handleDate = async () => {
    var firstArr = [];
    var secondArr = [];
    //firstCount means the user number in the database
    for (var i = 0; i < firstCount; i++) {
        // i get some result from a call called file
        //secondCount means the number of files for each user in the database
        for (var j = 0; j < secondCount; j++) {
            // i get some result from called file  
       //this also can be secondArr.push({index:result[0], files:file})
            secondArr.push(file);    < ------------- I guess the problem is here, the right files needs to be save in the array of the right user
        }
        // i get an array as a result from a call called result
        firstArr.push({ index: result[0], firstName: result[1], files: secondArr });

        this.setState({ users: firstArr });
    }

}
状态={
用户:[
索引:“”,
名字:“,
文件:[],
];
}
handleDate=async()=>{
var firstArr=[];
var secondArr=[];
//firstCount表示数据库中的用户编号
对于(变量i=0;i
我可以看到两个错误,它们可能会导致您意想不到的行为

首先,您应该在第一个循环中声明内部数组变量,否则您可能会在多个用户之间不断添加文件。这可能是你的意图,也可能不是

其次,您正在循环中调用
setState
,这将无法按预期工作,因为:

  • setState
    调用实际上是由react批处理的。他们不会开火 马上
  • 您正在改变状态,从第二次设置状态调用开始 现在,您正在更改相同的数组。你可能决定不去 重新渲染第二次调用,因为它看到相同的数组。我会更新 这一答案将在稍后提供有关不变性的参考资料
  • 根据我建议的更改,您的代码应该如下所示:

    handleDate = async()=>{
        var firstArr=[];
    
        for (var i = 0; i < firstCount; i++) {
            // i get some result from a call called file
            var secondArr=[];
            for (var j = 0; j < secondCount; j++) {
                // i get some result from called file  
                secondArr.push(file); 
            }
           // i get an array as a result from a call called result
           firstArr.push({index:result[0], firstName:result[1], files:secondArr});
    
        }
        this.setState({users:firstArr});
    }
    
    handleDate=async()=>{
    var firstArr=[];
    对于(变量i=0;i
    检查您的
    状态=
    代码,它现在不是有效的JavaScript。您还在循环中设置状态,这意味着您有多个对
    this.setState
    的异步调用,这些调用或多或少同时发生,所有调用都会覆盖
    users
    字段。你需要做的是首先合成整个对象,然后设置
    用户
    ,一次。我知道你能用一些代码提供一个解决方案来解决这个问题吗?这一切发生在哪里?在构造函数中还是在某个生命周期方法中?我认为您的一些代码缺失(至少我无法理解)@dubes这是一个单独的函数,用于从数据库(区块链)获取有关用户的数据。您可以提供您尝试循环使用的数据的模型吗?我认为有一个更简单的解决办法,比你如何试图解决它。以@ChrisG advice为例,一直调用setState是不好的,因为它会导致许多可能会影响性能的重新加载,除非您要满足这一点,否则在shouldcomponentupdate中,相同的文件[]应该发送给每个用户,而不是正确的文件,如何在循环之外设置state仍然面临我的解决方案的问题?这两点都应该在我共享的代码中解决,如果您将正确的文件放在第二个数组中,那么firstArr中的每个条目都应该是唯一的
    setState
    已移到循环外,请参见在第一个循环结束后调用它。@FUN\uvar secondArr=[];在循环中,所有用户的所有文件都会转到每个用户-->可能是如何获取“文件”的问题。您能在中创建问题的小副本吗?也许只有3个用户感谢你的努力