按钮回调中的log语句显示未定义

时间:2018-08-02 15:27:12

标签: javascript reactjs

在下面发布的示例中,我正在尝试记录按钮的编号。但是当我点击任何按钮时e.target.i显示未定义?? 我正在使用沙箱

请让我知道如何解决此问题。

代码

import React from "react";
import ReactDOM from "react-dom";
import createReactClass from "create-react-class";

class ButtonClicks extends React.Component {
  constructor(props) {
    super(props);
    this.onClickFunction = this.onClickFunction.bind(this);
  }

  onClickFunction(e) {
    console.log("button# " + e.target.id);
  }

  render() {
    var arrButtons = [];
    var buttonStyle = {
      margin: "10px 10px 10px 0"
    };
    for (let i = 0; i < 20; i++) {
      //Moved your loop outside render()'s return
      arrButtons.push(
        <button
          id={i}
          style={buttonStyle}
          onClick={() => this.onClickFunction()}
        >
          {i}
        </button>
      );
    }
    return (
      <div>
        {arrButtons} {/*Very important to wrap the buttons inside a div*/}
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<ButtonClicks />, rootElement);
export default ButtonClicks;

1 个答案:

答案 0 :(得分:3)

使用箭头函数语法时,调用函数时传递给该函数的参数需要像

那样显式传递
arrButtons.push(
    <button
      id={i}
      style={buttonStyle}
      onClick={(e) => this.onClickFunction(e)}
    >
      {i}
    </button>
  ); 

但是,更好的方法是在render之外使用arrow函数,但是由于您已经在构造函数中使用了它,因此您甚至不需要使用arrow函数语法。

onClickFunction = (e) => {
    console.log("button# " + e.target.id);
  }

  render() {
    var arrButtons = [];
    var buttonStyle = {
      margin: "10px 10px 10px 0"
    };
    for (let i = 0; i < 20; i++) {
      //Moved your loop outside render()'s return
      arrButtons.push(
        <button
          id={i}
          style={buttonStyle}
          onClick={this.onClickFunction}
        >
          {i}
        </button>
      );
    }
    return (
      <div>
        {arrButtons} {/*Very important to wrap the buttons inside a div*/}
      </div>
    );
  }