子组件中的onClick不触发

ReactJS : onClick in sub-component does not trigger

本文关键字:onClick 组件      更新时间:2023-09-26

我试图在JSX中创建一个子组件,这是一个带有onClick事件和事件处理程序的项目列表。事件处理程序永远不会被调用。请帮我找出我做错了什么。

  • React Chrome开发者工具扩展显示为每个"li"创建一个"onClick"事件处理程序
  • context (this)是一个"Constructor"对象,它的属性是"handleClick"函数。

编辑:感谢@FakeRainBrigand,我发现问题在别处。我发现,当我在父组件中使用事件处理程序隐藏/显示子组件时,它会停止触发onClick事件处理程序,因为父组件的隐藏操作触发了。JSBIN

JSX代码。

var FilterList = React.createClass({
    handleClick: function(e){
        console.log(e);
    },
    render: function(){
        var ListItems = this.props.data.map(function(item){
            return (
                <li key={item.id} className="filter-item" onClick={this.handleClick}>
                    <span key={'img'+item.id} className={item.imgClass}></span>
                    <span key={'text'+item.id} className="item-text">{item.name}</span>
                </li>
            )
        }, this);
        return (
            <div className="filter-list">
                    <ul>
                        {ListItems}
                    </ul>
                </div>
            );
    }
});
生成的JS代码:
var FilterList = React.createClass({displayName: 'FilterList',
    handleClick: function(e){
        console.log(e);

    },
    render: function(){
        var ListItems = this.props.data.map(function(item){
            return (
                React.DOM.li( {key:item.id, className:"filter-item", onClick:this.handleClick}, 
                    React.DOM.span( {key:'img'+item.id, className:item.imgClass}),
                    React.DOM.span( {key:'text'+item.id, className:"item-text"}, item.name)
                )
            )
        }, this);
        return (
            React.DOM.div( {className:"filter-list"}, 
                    React.DOM.ul(null, 
                        ListItems
                    )
                )
            );
    }
});

如果添加self = this;然后改变这个。handleClick到self。handleClick?

render: function() {

    self = this;
    var ListItems = this.props.data.map(function(item){
        return (
            <li key={item.id} className="filter-item" onClick={self.handleClick}>
                <span key={'img'+item.id} className={item.imgClass}></span>
                <span key={'text'+item.id} className="item-text">{item.name}</span>
            </li>
        )
    }, this);

你想让你的服务器/ajax调用在componentDidMount,而不是componentWillMount。你可以在这里的文档中查看原因React Component Lifecycle

可以使用回调函数。在onclick上使用这样的回调:

var FilterList = React.createClass({
handleClick: function(e){
    console.log(e);
},
render: function(){
    var ListItems = this.props.data.map(function(item){
        return (
            <li key={item.id} className="filter-item" onClick={() => this.handleClick}>
                <span key={'img'+item.id} className={item.imgClass}></span>
                <span key={'text'+item.id} className="item-text">{item.name}</span>
            </li>
        )
    }, this);
    return (
        <div className="filter-list">
                <ul>
                    {ListItems}
                </ul>
            </div>
        );
}
});