React: восстановить динамический дочерний ключ при событии
Я знаю, что динамические дети компонента должны иметь уникальный 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
является другой реакционной компонентой, вложенной здесь, с помощью метода render
ниже:
render: function() {
var results = this.props.results;
return (
<div className="something">
<input type="text" onChange={this.props.changeCallback} />
</div>
);
}
есть ли способ доступа к ключу при вызове callbackFn(event)
?
Ответы
Ответ 1
Частично применить обратный вызов функции с помощью встроенного JavaScript bind
. Это указано в разделе "Реакция" Связь между компонентами" doc:
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>
);
}
Ответ 2
Хотя первый ответ правильный, это считается плохой практикой, поскольку:
Функция привязки или функция стрелки в 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);
}
});
Источник: https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md