将点击事件添加到React.Js

时间:2019-01-07 02:30:47

标签: javascript reactjs reactjs.net

我正在学习React.Js。我正在尝试附加一个事件以在控制台中写一些东西,但是我无法触发我的函数。有谁知道我如何将onClick事件附加到react div?抱歉,这是一个基本问题,但我尝试了几种不同的方法,但均无效果。

我已经尝试了两种触发以下功能的方法,但是都无法正常工作。

因此,我已经意识到事件不起作用的原因是因为我正在渲染服务器端。如果我在客户端上渲染,则事件触发。如果我最初在服务器上进行渲染,有人知道如何触发它吗?

class Individual extends React.Component {
    handleClick = () => {
        alert("GREAT");
    }
    render() {
        const indDiv = {
            margin: '5px',
            width: '100px',
            height: '120px',
            cursor: 'pointer',
            border: '5px solid pink',
            color: 'blue',
            float: 'left'
        };

        return (
            <div>
                <div onClick={this.handleClick.bind(this)}>
                    Alert 1
                </div>
                <div onClick={() => this.handleClick}>
                    Alert 2
                </div>
                <div style={indDiv}>
                    {this.props.num}. {this.props.name}.
                </div>
            </div>
        );
    }
}

感谢所有对此做出贡献的人。经过一切之后,我发现由于最初是作为服务器渲染的片段创建的,因此我不得不在页面渲染之后附加事件。我当时使用ReactJS.Net,不得不使用水合物单独对其进行初始化。

6 个答案:

答案 0 :(得分:2)

两种调用处理函数的方法在您的代码中都是错误的。

在您的代码中handleClick是一个箭头函数,因此不需要手动绑定。

如果它不是箭头函数,则手动绑定应始终仅在构造函数中完成。永远不要像在渲染中那样绑定其他任何地方。

当您使用onClick = {()=> this.handleClick}时,这是错误的。它应该是onClick = {()=> this.handleClick()}。如果没有括号,则这是正确的onClick = {this.handleClick}

所以改变

    <div onClick={this.handleClick.bind(this)}>
                Alert 1
            </div>
            <div onClick={() => this.handleClick}>
                Alert 2
            </div>

收件人

    <div onClick={()=> this.handleClick()}>
                Alert 1
            </div>
            <div onClick={() => this.handleClick()}>
                Alert 2
            </div>

您不应该在组件中除构造函数之外的其他任何地方进行绑定的原因是,例如您直接在render中进行绑定,因此在这种情况下,每次组件渲染和重新渲染时,它将在webpack捆绑文件中创建一个新函数因此,捆绑文件再次变大。因此,建议仅将其绑定在构造器中

答案 1 :(得分:1)

您需要在render方法之后声明处理程序方法。这是jsfiddle中代码的基本实现。

https://jsfiddle.net/ufyxwv8p/

class Individual extends React.Component {
    render() {
        const indDiv = {
            margin: '5px',
            width: '100px',
            height: '120px',
            cursor: 'pointer',
            border: '5px solid pink',
            color: 'blue',
            float: 'left'
        };

        return (
            <div>
                <div onClick={this.handleClick}>
                    Click to show in console
                </div>
                <div style={indDiv}>
                    {this.props.num}. {this.props.name}.
                </div>
            </div>
        );
    }
    handleClick = () => {
        console.log('this is:', this);
    }
}

ReactDOM.render(<Individual/>,document.getElementById("app"))

答案 2 :(得分:0)

您必须使用bind

onClick={this.handleClick.bind(this)}

或使用箭头功能

onClick={()=>this.handleClick()}

答案 3 :(得分:0)

Alert 1上的点击处理程序已经可以使用。使用bind类属性语法时,不必() => {}

您在Alert 2上的点击处理程序不起作用,因为您已经编写了一个内联箭头函数,该函数返回了另一个函数。您需要调用它,例如() => this.handleClick()

这是您的代码的有效摘要。

class Individual extends React.Component {
  handleClick = () => {
    alert("GREAT");
  };
  render() {
    const indDiv = {
      margin: "5px",
      width: "100px",
      height: "120px",
      cursor: "pointer",
      border: "5px solid pink",
      color: "blue",
      float: "left"
    };

    return (
      <div>
        <div onClick={this.handleClick}>Alert 1</div>
        <div onClick={() => this.handleClick()}>Alert 2</div>
        <div style={indDiv}>
          {this.props.num}. {this.props.name}.
        </div>
      </div>
    );
  }
}

ReactDOM.render(<Individual />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="app"></div>

答案 4 :(得分:0)

在这里尝试这样定义您的handleclick函数的方式是错误的,我已经在沙盒上在线编辑了代码以使其正常工作。调用功能,就像您在Alert 1上的调用方式,而不是定义功能,就像我上传图片的方式一样

Link of codesandbox of your code check that

Check this image of that code if you dont have time to go through whole code

答案 5 :(得分:0)

class Individual extends React.Component {
  handleClick = () => {
    alert("GREAT");
  };
  render() {
    const indDiv = {
      margin: "5px",
      width: "100px",
      height: "120px",
      cursor: "pointer",
      border: "5px solid pink",
      color: "blue",
      float: "left"
    };

    return (
      <div>
        <div onClick={this.handleClick}>Alert 1</div>
        <div onClick={this.handleClick}>Alert 2</div>
        <div style={indDiv}>
          {this.props.num}. {this.props.name}.
        </div>
      </div>
    );
  }
}

ReactDOM.render(<Individual />, document.getElementById("app"));