Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.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 React中的数组长度为';t匹配到它拥有的元素数_Javascript_Arrays_Reactjs - Fatal编程技术网

Javascript React中的数组长度为';t匹配到它拥有的元素数

Javascript React中的数组长度为';t匹配到它拥有的元素数,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,每次单击我的卡组件时,它都在运行cardSelected()函数。我可以看到选择的状态数组正在使用卡ID正确更新,但当我使用setState()检查数组长度时,它是一个 数组开始为空 单击第一张卡后,将使用卡id更新阵列 console.log(this.state.selected.length)当我希望它是1时,它的长度仍然显示为0,并且可以看到它在状态中有1值 cardSelected=id=>{ this.setState(prevState=>({ 已选择:[…prevState.s

每次单击我的卡组件时,它都在运行
cardSelected()
函数。我可以看到选择的状态数组正在使用卡ID正确更新,但当我使用
setState()
检查数组长度时,它是一个

  • 数组开始为空
  • 单击第一张卡后,将使用卡id更新阵列
  • console.log(this.state.selected.length)
    当我希望它是
    1
    时,它的长度仍然显示为
    0
    ,并且可以看到它在状态中有
    1
  • cardSelected=id=>{
    this.setState(prevState=>({
    已选择:[…prevState.selected,id]
    }));
    console.log(this.state.selected.length);
    
    };之所以会发生这种情况,是因为setState可能是异步的,我建议您阅读以下内容

    在代码中,可以使用回调函数作为setState函数的第二个参数,该函数将在定义新状态时执行

    cardSelected = id => {
      this.setState(prevState => ({
        selected: [...prevState.selected, id]
      }), () => {
        console.log(this.state.selected.length)
      });
    };
    

    之所以会发生这种情况,是因为setState可能是异步的,我建议阅读本文

    在代码中,可以使用回调函数作为setState函数的第二个参数,该函数将在定义新状态时执行

    cardSelected = id => {
      this.setState(prevState => ({
        selected: [...prevState.selected, id]
      }), () => {
        console.log(this.state.selected.length)
      });
    };
    

    这是因为
    setState
    是异步的

    为了工作,请使用状态更新后执行的回调进行如下修复:

    this.setState(prevState => ({
      selected: [...prevState.selected, id]
    }),
    () => console.log(this.state.selected.length))
    

    这是因为
    setState
    是异步的

    为了工作,请使用状态更新后执行的回调进行如下修复:

    this.setState(prevState => ({
      selected: [...prevState.selected, id]
    }),
    () => console.log(this.state.selected.length))
    

    正如一些同行回答的那样,setState是asnyc。并不是说人们建议的代码有什么问题。我认为你可以用下面的方法更好地写出你的逻辑

    cardSelected = id => {
            const selected = [...this.state.selected, id];
            this.setState({ selected: selected });
        };
    

    您可以更好地使用调试状态值,而不是记录所有内容。如果您仍然觉得登录到console更好,那么您可以尝试登录render()方法或componentDidUpdate(),因为它们是检查数据的正确位置。

    正如一些同行回答的,setState是asnyc。并不是说人们建议的代码有什么问题。我认为你可以用下面的方法更好地写出你的逻辑

    cardSelected = id => {
            const selected = [...this.state.selected, id];
            this.setState({ selected: selected });
        };
    

    您可以更好地使用调试状态值,而不是记录所有内容。如果您仍然觉得登录到控制台更好,那么可以尝试登录render()方法或componentdiddupdate()因为它们是检查数据的正确地点。

    官方文档明确描述了“状态更新可能是异步的”官方文档明确描述了“状态更新可能是异步的”