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

IT技术 javascript reactjs
2021-05-22 14:54:17

我知道组件的动态子级必须具有key如下唯一性(官方文档中的修改示例):

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

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

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

有什么方法可以在callbackFn(event)被调用时访问密钥

3个回答

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

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

更好的方法:

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

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

通过使用 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>
  );
}

我们可以使用数据属性访问数据

// ChildComponent.js
render: function() {
  var results = this.props.results;
  return (
    <div className="something">
       <input 
          type="text" 
          onChange={this.props.changeCallback} 
          data-key={this.props.key} // "key" was passed as props to <ChildComponent .../>
       />
    </div>
  );
}

现在; 在你的changeCallback方法中;你可以访问这个data

// ParentComponent.js
(evt) => {
  console.log(evt.target.dataset.key);
}

祝你好运...