ReactJS: onClick handler not firing when placed on a child component

前端 未结 2 553
名媛妹妹
名媛妹妹 2020-12-04 11:11

I recently started working with ReactJS. Specifically, I am utilizing the react-rails ruby gem and react-bootstrap components.

相关标签:
2条回答
  • 2020-12-04 11:16

    So, the proper way to handle eventing in this case would be to pass the event handler down to the child component. There are a few ways to accomplish what you want, and I might implement this behavior differently (not sure what the use case is), but I wired up an example in JSX for you that demonstrates the typical event handling between Parent and Child Components. You can find it here...

    JS Fiddle

    Just think of it like this:

    var ParentComponent = React.createClass({
        render: function(){
            return (
                <ChildComponent onSomeEvent={this.handleThatEvent} />;
            )
        },
        handleThatEvent: function(e){
             //update state, etc.
        }
    });
    
    var ChildComponent = React.createClass({
        render: function(){
            return (
               <input type="button" onClick={this.props.onSomeEvent} value="Click Me!" />
            )
        }
    });
    
    0 讨论(0)
  • 2020-12-04 11:17

    You don't need to make a child component if before you call the node you create a var to reference the render's this i.e.

    var self = this;
    

    So for example (this is contrived and the var self isn't needed in this case, but in the case of nested return statements it would be required).

    var ParentComponent = React.createClass({
        render: function(){
            var self = this;
            return (
                <input type="button" onClick={self.handleThatEvent} value="Click Me!" />;
            )
        },
        handleThatEvent: function(e){
             //update state, etc.
        }
    });
    

    Better yet, you could bind this to the function.

    var ParentComponent = React.createClass({
        render: function(){
            return (
                this.state.array.map(function(){
                  return (<input type="button" onClick={this.handleThatEvent} value="Click Me!" />);
                }.bind(this));
            )
        },
        handleThatEvent: function(e){
             //update state, etc.
        }
    });
    

    Or to follow captray's suggestion in the comments

    var ParentComponent = React.createClass({
        render: function(){
            return (
                this.state.array.map(function(){
                  return (<input type="button" onClick={this.handleThatEvent} value="Click Me!" />);
                }, this);
            )
        },
        handleThatEvent: function(e){
             //update state, etc.
        }
    });
    
    0 讨论(0)
提交回复
热议问题