58

我最近开始使用ReactJS. 具体来说,我正在使用react-rails红宝石宝石和react-bootstrap组件。

我有一个关于onClick在子组件中放置事件侦听器的问题。

正如您从下面的代码示例中看到的,我有一个父组件,它在其render函数中“调用”一个子组件。在该render函数中,我有 ReactonClick侦听器,在单击它时会调用handleToggle它。

###* @jsx React.DOM ###

ToggleIconButton = React.createClass
  getInitialState: ->
    toggleOn: false
  handleToggle: (evt) ->
    this.setState(toggleOn: !this.state.toggleOn)
  render: ->
    `<IconButton onClick={this.handleToggle}>Toggle Button</IconButton>`

IconButton = React.createClass
  render: ->
    # BsButton and BsGlyphicon are React-Bootstrap components
    `<BsButton>
      <BsGlyphicon glyph={this.props.glyph} />
      {" " + this.props.text}
     </BsButton>`

不幸的是,这并没有像我想象的那样工作。ToggleIconButton::handleToggle永远不会被调用。相反,onClick监听器被放置在IconButton和引用上ToggleIconButton::handleToggle

React 开发工具屏幕


我不想在IconButton. 在我看来,不应该将条件逻辑放在IconButton. 它应该做的只是代表一个图标和按钮,而不必担心任何浏览器事件。这ToggleIconButton就是为了。

虽然我知道我可以环绕React Div并在那里IconButton写一个onClick监听器(我已经尝试过并且它有效),但这似乎有点笨拙。

有人知道这样做的好方法吗?多谢你们!

4

2 回答 2

81

因此,在这种情况下处理事件的正确方法是将事件处理程序向下传递给子组件。有几种方法可以实现您想要的,我可能会以不同的方式实现此行为(不确定用例是什么),但我在 JSX 中为您连接了一个示例,该示例演示了父组件和子组件之间的典型事件处理。你可以在这里找到它...

JS小提琴

想一想:

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!" />
        )
    }
});
于 2014-06-09T23:21:00.433 回答
9

如果在调用节点之前创建一个 var 来引用渲染的 this,则不需要创建子组件,即

var self = this;

例如(这是人为的,在这种情况下不需要 var self,但在嵌套的 return 语句的情况下,它是必需的)。

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.
    }
});

更好的是,您可以将它绑定到函数。

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.
    }
});

或在评论中遵循 captray 的建议

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.
    }
});
于 2014-11-14T06:20:34.120 回答