ReactJSTips: Анонимная функция

  • суббота, 14 июля 2018 г. в 06:58:00

Передавать callback в компоненты можно разными способами и не каждый может быть верным. Я исходил из «best practices» от Airbnb и из своего опыта и делюсь тем, как правильно пробрасывать методы в ваши компоненты.

Анонимная функция (передача аргументов вручную)


_10
// ✅ GOOD
_10
<Button onClick={removeItem.bind(this, id)}>Удалить</Button>
_10
_10
// ❌ BAD
_10
<Button
_10
onClick={() => {
_10
removeItem(id);
_10
}}>
_10
Удалить
_10
</Button>

Старайтесь не создавать анонимную функции, для передачи данных в другую функцию в «функциональном компоненте (stateless component)». Для подобной ситуации, используйте метод — .bind().

Метод bind() создаёт новую функцию, которая при вызове устанавливает в качестве контекста выполнения this предоставленное значение. В метод также передаётся набор аргументов, которые будут установлены перед переданными в привязанную функцию аргументами при её вызове.

В onClick передавайте функцию removeItem с привязкой контекст и новых аргументов.

Подробнее о .bind(): https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

Анонимная функция (передача аргументов по умолчанию)


_10
// ✅ GOOD
_10
<Input onChange={this.props.onChange} />
_10
_10
// ✅ GOOD
_10
<Input onChange={this.props.onChange.bind(this, 'myField')} />
_10
_10
// ❌ BAD
_10
<Input onChange={value => this.props.onChange(value)} />

В данном случае, метод onChange автоматически передаст value первым аргументом в функцию this.props.onChange.

Если же вы хотите добавить дополнительные аргументы, после value, пробрасывайте их через .bind(this, ...). В итоге, onChange получит 2 значания — введённое значение пользователем и строку myField.

Переопределение контекста this в конструкторе


_26
// ✅ GOOD
_26
class App extends React.Component {
_26
constructor() {
_26
super();
_26
this.myMethod = this.myMethod.bind(this);
_26
}
_26
myMethod() {
_26
...
_26
}
_26
render() {
_26
return <Button onClick={this.myMethod}></Button>;
_26
}
_26
}
_26
_26
// ❌ BAD
_26
class App extends React.Component {
_26
constructor() {
_26
super();
_26
}
_26
myMethod() {
_26
...
_26
}
_26
render() {
_26
return <Button onClick={this.myMethod.bind(this)}></Button>;
_26
}
_26
}

Верным решением для компонента-класса, будет переопределять контекст this внутри конструктора.

#jsx#js#bestpractices#reactjstips