React:在事件时检索动态子键

Yan*_*oto 23 javascript reactjs

我知道组件的动态子项必须具有以下唯一key(来自官方文档的修改示例):

render: function() {
  var results = this.props.results;
  return (
    {results.map(function(result) {
      return <ChildComponent type="text" key={result.id} changeCallback={this.props.callbackFn}/>;
    })}
  );
}
Run Code Online (Sandbox Code Playgroud)

考虑到这ChildComponent是另一个嵌套在这里的React组件,render方法如下所示

render: function() {
  var results = this.props.results;
  return (
    <div className="something">
       <input type="text" onChange={this.props.changeCallback} />
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

callbackFn(event)调用时有没有办法访问密钥?

bar*_*zag 34

虽然第一个答案是正确的,但这被认为是一种不好的做法,因为:

JSX prop中的绑定调用或箭头函数将在每个渲染上创建一个全新的函数.这对性能不利,因为它会导致垃圾收集器的调用方式超出必要的范围.

更好的方法:

var List = React.createClass({
  handleClick (id) {
    console.log('yaaay the item key was: ', id)
  }

  render() {
    return (
      <ul>
        {this.props.items.map(item =>
          <ListItem key={item.id} item={item} onItemClick={this.handleClick} />
        )}
      </ul>
    );
  }
});

var ListItem = React.createClass({
  render() {
    return (
      <li onClick={this._onClick}>
        ...
      </li>
    );
  },
  _onClick() {
    this.props.onItemClick(this.props.item.id);
  }
});
Run Code Online (Sandbox Code Playgroud)

资料来源:https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md

  • 或者你可以接受它作为正确的答案:) (9认同)

Ros*_*len 21

使用JavaScript的本机部分应用函数回调bind.这在React的" 组件间通信 "文档中提到:

callbackFn: function(key) {
  // key is "result.id"
  this.props.callbackFn(key);
},
render: function() {
  var results = this.props.results;
  return (
    <div>
      {results.map(function(result) {
        return (
          <ChildComponent type="text" key={result.id}
            changeCallback={this.callbackFn.bind(this, result.id)} />
        );
      }, this)}
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不能以更好的方式直接访问`key`?这感觉就像一个粗略的解决方法...... (9认同)