PassFront
  1. PassFront
  2. База знаний
  3. Основы React

Зачем нужно связывание в React?

Основы React

«Связывание» в React — чаще всего про bind(this) в классовых компонентах; иногда под этим имеют в виду data binding (связь данных и UI). Разберём оба смысла.

Смысл 1: биндинг this в классах

Методы класса при передаче как колбэки теряют this:

class Form extends React.Component {
  handleSubmit() {
    this.setState({ sent: true }); // TypeError: this === undefined
  }

  render() {
    return <button onClick={this.handleSubmit}>Ок</button>;
    // передали ФУНКЦИЮ без привязки к экземпляру
  }
}

Причина — семантика this в JS: он определяется способом вызова, а не местом объявления; колбэк вызывается «сам по себе», без объекта. Способы связывания:

// 1. bind в конструкторе (классика)
constructor(props) {
  super(props);
  this.handleSubmit = this.handleSubmit.bind(this);
}

// 2. стрелочное поле класса (современный стандарт для классов)
handleSubmit = () => { this.setState({ sent: true }); };

// 3. стрелка в render (работает, но новая функция каждый рендер)
onClick={() => this.handleSubmit()}

В функциональных компонентах проблемы нет — this не используется, поэтому с переходом на хуки тема ушла.

Смысл 2: связывание данных (data binding)

В React — однонаправленное: state → UI (данные вниз через props/JSX). «Обратной» магической записи нет: двустороннее связывание (как v-model во Vue) собирается вручную парой value + onChange:

<input value={name} onChange={(e) => setName(e.target.value)} />

Явность этого цикла — осознанный выбор React: поток данных всегда прослеживаем.

Коротко для собеседования

Если про bind: методы классов теряют this при передаче колбэком — привязывают bind'ом в конструкторе или стрелочными полями; в хуках проблема отсутствует. Если про data binding: React — однонаправленное связывание, «двустороннее» для форм собирается явно из value + onChange.

Другие вопросы раздела