React - onClick 用于动态生成的组件

React - onClick for dynamically generated components

我正在编写一个简单的 React 应用程序来查询 API,获取 JSON 项目列表,并为每个项目创建单独的按钮。 API 调用完成后,我将应用程序的状态更改为 JSON 对象,这会导致 render() 方法呈现按钮列表。

axios.get('http://api_url')
.then(response => {
  this.setState({applicationJSON: response.data});
})
.catch(function (error) {
  console.log(error);
});

问题是,我无法将 onClick 附加到这些按钮。

renderItems(text) {
return (
  <div>
    {
      text.map(function(name, index) {
        return <Button text={text[index].name} onClick={() => handleClick()} />
      })
    }
  </div>
);
}

每当我单击这些按钮之一时,我都会收到一条错误消息,指出 handleClick() 未定义。

我知道这是动态生成元素的问题,因为当我在构造函数中创建一个 Button 项并将 onClick 绑定到 handleClick 时,会调用 handleClick()。

在 React 中处理动态生成组件的按钮点击的正确方法是什么?

它不起作用的原因是因为当我们使用 function 关键字(在 text.map 中)时,函数内部的 this 并不引用相同的 this 作为封闭范围。您可以维护对封闭范围的引用,例如

renderItem(text) {
    const self = this;
        return (
            <div>
                {text.map(function(name, index) {
                    return <Button text={text[index].name} onClick={self.handleClick} />
                })}
            </div>
        );
    }

或者,您可以使用一些 ES6 语言功能使整个事情变得更简洁。您的映射功能也可以简化。

class MyComponent extends React.Component {
    handleClick = (evt) => {
        // do something
    }

    renderItem = (text) => {
        return (
            <div>
                {text.map(item => (
                    <Button text={item.name} onClick={this.handleClick} />
                ))}
            </div>
        );
    }
}

这是有效的,因为 this 内部 lambda 函数(=> 函数)指的是函数的外部上下文。