在 React 的事件处理程序中获取组件的 prop

Get component's prop in its event handler in React

有一个带有 key 属性和 onClick 事件处理程序的 React 组件。我需要创建一些这样的组件,并将它们的 key 值作为点击事件处理程序的参数。但是如果参数是 value 变量,它在 for 循环迭代后取它的最终值。例如,如果我创建三个组件,handleClick 函数从每个组件获取 value = 3,但它应该从第一个组件获取 1,从第二个组件获取 2,依此类推.

createComponents(n) {
    let value = 0;
    let list = [];
    for (let i = 0; i < n; i++) {
        list.push(
            <Component
            key={value}
            onClick={() => {
                handleClick(value);
            }}
            />
        );
        value += 1;
    }
    return list;
}
该箭头函数中的

this 将引用渲染它的组件,而不是您正在渲染的 Component 实例。

您可以使用 i 而不是 value。因为它是在带有 letfor 语句中声明的,所以为每个循环迭代创建一个 *different i(是的,真的)。所以:

createComponents(n) {
    let list = [];
    for (let i = 0; i < n; i++) {
        list.push(
            <Component
                key={i}
                onClick={() => {
                  handleClick(i);
                }}
            />
        );
    }
    return list;
}

如果由于某种原因 valuei 与您问题中的 不同,您可以使用局部常量(或for 块中的变量)以捕获 value 的值:

createComponents(n) {
    let value = 0;
    let list = [];
    for (let i = 0; i < n; i++) {
        const thisValue = value;
        list.push(
            <Component
                key={thisValue}
                onClick={() => {
                  handleClick(thisValue);
                }}
            />
        );
        ++value;
    }
    return list;
}

因为它是用 const 声明的,所以它是为 每次迭代 创建的块作用域的局部(就像 i 一样)。如果您也使用 let(但不使用 var),那将是正确的。

您遇到了范围界定问题。 handleClick() 引用的值在执行时为 n - 1(for 循环的上限)。你需要的是让 handleClick() 引用一个块级变量,比如 i 或者在 handleClick() 中引入另一个闭包。

 createComponents(n) {
    let value = 0; // do  not use this, all handleclicks will reference last set value
    let list = [];
    for (let i = 0; i < n; i++) {
          list.push(
            <Component
              key={i}
              onClick={() => {
                handleClick(i);
              }}
            />
          );
        }
    return list;

}

使用上面的代码,您将实现与 value 相同的更改,与 i 相同。

您可以阅读更多关于 closures and lexical scoping