Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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 学习反应-参考错误_Javascript_Reactjs - Fatal编程技术网

Javascript 学习反应-参考错误

Javascript 学习反应-参考错误,javascript,reactjs,Javascript,Reactjs,从今天开始学习react,我遇到了一个可能比react更与JS相关的问题 import React, { useState } from "react"; import Counter from "./counter"; function Counters() { const [counters, setCounters] = useState([ { id: 1, value: 4 }, { id: 2, value: 0 },

从今天开始学习react,我遇到了一个可能比react更与JS相关的问题

import React, { useState } from "react";
import Counter from "./counter";

function Counters() {
  const [counters, setCounters] = useState([
    { id: 1, value: 4 },
    { id: 2, value: 0 },
    { id: 3, value: 0 },
    { id: 4, value: 0 },
  ]);


  const handleDelete = (counterID) => {
    setCounters(counters.filter((counter) => counter.id !== counterID));
  };

  const handleIncrement = (counterToBeUpdated) => {
    console.log(counters);
    const counters = [...counters];
    const index = counters.indexOf(counterToBeUpdated);
    counters[index] = { ...counterToBeUpdated };
    counters[index].value++;
    setCounters({ counters });
  };

  return (
    <div>
      {counters.map((counter) => (
        <Counter
          key={counter.id}
          counter={counter}
          onDelete={handleDelete}
          onIncrement={handleIncrement}
        />
      ))}
    </div>
  );
}

export default Counters;

当子组件调用handleIncrement时,我得到一个引用错误,即在初始化计数器之前尝试访问计数器。

这是因为您试图从外部作用域使用一个同名的变量: 常量计数器=[…计数器]

常量计数器=[1,2,3]; 功能更新{ 常量计数器=[…计数器]; } 使现代化
//=>未捕获引用错误:无法在初始化之前访问“计数器”这是因为您试图使用外部作用域中具有相同名称的变量: 常量计数器=[…计数器]

常量计数器=[1,2,3]; 功能更新{ 常量计数器=[…计数器]; } 使现代化
//=>未捕获引用错误:无法在初始化之前访问“计数器”我认为这里的主要问题是如何调用handleIncrement。 它在没有参数的情况下被调用,这意味着countertoUpdated将是未定义的

如果您将onIncrement={handleIncrement}更改为onIncrement={=>handleIncrementcounter.id},这就完成了一半

您使用的计数器的手内增量。indexOfcounterToBeUpdated。返回作为参数传递的值的数组位置。因为您正在寻找一个对象,并且对象相等性是javascript中的一个重要特性,所以我建议您最好使用Array.find here

这就是在数组中查找对象的方式

const counterToBeUpdated = counters.find((counter) => counter.id === counterToBeUpdated);
由于此方法仍有许多工作要做,请使用计数器创建新数组,将此数组设置为状态,我将使用array.map向您显示一个快捷方式:


Array.map返回一个新数组。您传递的函数将针对数组中的每个值执行,您可以决定新数组中的适当值的外观。

我认为这里的主要问题是如何调用handleIncrement。 它在没有参数的情况下被调用,这意味着countertoUpdated将是未定义的

如果您将onIncrement={handleIncrement}更改为onIncrement={=>handleIncrementcounter.id},这就完成了一半

您使用的计数器的手内增量。indexOfcounterToBeUpdated。返回作为参数传递的值的数组位置。因为您正在寻找一个对象,并且对象相等性是javascript中的一个重要特性,所以我建议您最好使用Array.find here

这就是在数组中查找对象的方式

const counterToBeUpdated = counters.find((counter) => counter.id === counterToBeUpdated);
由于此方法仍有许多工作要做,请使用计数器创建新数组,将此数组设置为状态,我将使用array.map向您显示一个快捷方式:


Array.map返回一个新数组。您传递的函数将对数组中的每个值执行,您将决定新数组中的适当值的外观。

您有一些错误:此行setCounters{counters};是错误的,计数器是数组,但您正在将其更改为对象。至于引用错误,您在handleIncrement函数中分配了一个局部变量,该变量会遮挡外部状态,但在分配之前您会尝试记录它。这是否回答了您的问题?到处都有计数器:const counters=[…counters];。是否要分散外部作用域中的计数器并将其分配给相同的变量名?有几个错误:此行setCounters{counters};是错误的,计数器是数组,但您正在将其更改为对象。至于引用错误,您在handleIncrement函数中分配了一个局部变量,该变量会遮挡外部状态,但在分配之前您会尝试记录它。这是否回答了您的问题?到处都有计数器:const counters=[…counters];。是否要从外部作用域分散计数器并将其分配给相同的变量名?