Javascript 在动态生成的元素中处理单击

Javascript 在动态生成的元素中处理单击,javascript,reactjs,Javascript,Reactjs,我注意到了这种模式好几次,开始思考什么才是正确的处理方式 假设我有一个对象数组,需要为其生成相应的可单击元素。在单击处理程序中,我希望能够访问相应的对象 render() { links = this.props.links.map(link => { <a onClick={this.clickHandle}> {link.title} </a> }) // ... } 虽然它能像预期的那样工作,但我想知道它是

我注意到了这种模式好几次,开始思考什么才是正确的处理方式

假设我有一个对象数组,需要为其生成相应的可单击元素。在单击处理程序中,我希望能够访问相应的对象

render() {
  links = this.props.links.map(link => {
    <a
      onClick={this.clickHandle}>
      {link.title}
    </a>
  })
  // ...
}

虽然它能像预期的那样工作,但我想知道它是否真的是正确的方法。每次React重建这段dom时,我似乎都在创建许多中间函数。这是个坏习惯吗?什么是替代方案?

即使它仍然创建了中间函数,但最重要的是使用.bind

什么是替代方案

创建一个链接组件,将数据作为道具获取并将其传递给单击处理程序:

var Link = React.createClass({
    propTypes: {
        data: ...,
        onClick: React.PropTypes.func.isRequired,
    },

    _onClick: function() {
        this.props.onClick(this.props.data);
    },

    render: function() {
        return (
            <a
                onClick={this._onClick}>
                {this.pops.data.title}
            </a>
        );
    }
});
用法:

links = this.props.links.map(
    link => <Link key={...} data={link} onClick={this.clickHandle} />
);

是的,这是执行OP描述的操作的一种更简单的方法,但它也有相同的缺点,即每次运行render时都会创建一个新函数。这是因为.bind返回一个新函数。这是个问题吗?可能99%的情况下都不会。我要补充的唯一一点是,你可能希望在标签上有一个{…this.props}排列
var Link = React.createClass({
    propTypes: {
        data: ...,
        onClick: React.PropTypes.func.isRequired,
    },

    _onClick: function() {
        this.props.onClick(this.props.data);
    },

    render: function() {
        return (
            <a
                onClick={this._onClick}>
                {this.pops.data.title}
            </a>
        );
    }
});
links = this.props.links.map(
    link => <Link key={...} data={link} onClick={this.clickHandle} />
);