Рефакторинг реагирует на эту привязку

у меня есть этот код

class BottomPanel extends React.Component<Props, {}> {
  constructor(props) {
    super(props);
    this.dropDownUpdate = this.dropDownUpdate.bind(this);
  }

  dropDownUpdate = e => this.setState({ dropDownValue: e.currentTarget.textContent });

Мне было интересно, смогу ли я провести рефакторинг

this.dropDownUpdate = this.dropDownUpdate.bind(this);

к

this.dropDownUpdate = this.dropDownUpdate;

если да, то почему или почему бы и нет? Я просто видел, что где-то так делают

this.dropDownUpdate = this.dropDownUpdate;

Я не уверен, смогу ли я применить это к своему коду.

Ты это пробовал?

JJJ 19.04.2019 08:07

да, я думаю, пока это работает. Но я действительно не хочу использовать его, если я не понимаю, почему.

user1176111 19.04.2019 08:08

разве это не работает без строки this.dropDownUpdate = this.dropDownUpdate.bind(this);?

nick zoum 19.04.2019 09:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
3
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Просто определите свою функцию, как показано ниже.

dropDownUpdate = (событие) => { .... }

Не нужно связываться в конструкторе

Это работает, только если вы используете плагин transfrom-class-properties babel (который поставляется с приложением create-react-app)

dwjohnston 19.04.2019 08:31

Поскольку dropDownUpdate — это функция со стрелкой, она должна работать, как и ожидалось, без

this.dropDownUpdate = this.dropDownUpdate; Или

this.dropDownUpdate = this.dropDownUpdate.bind(this);

В стрелочных функциях значение this связано лексически, в отличие от обычных функций, где значение this изменяется в зависимости от контекста, в котором вызывается функция.

Смотрите это: stackoverflow.com/questions/43600967/…

dwjohnston 19.04.2019 08:30

Спасибо за упоминание! @user1176111 user1176111 Проверьте плюсы и минусы каждого из них.

phpcoderx 19.04.2019 09:04
Ответ принят как подходящий

Одна вещь, о которой нужно знать, это то, что когда вы пишете:

class BottomPanel extends React.Component<Props, {}> {
  dropDownUpdate = e => this.setState({ dropDownValue: e.currentTarget.textContent });
}

Этот (в настоящее время) недопустимый синтаксис ES6. Вы не можете присвоить переменную класса со знаком равенства таким образом. Причина, по которой это работает, заключается в плагине transform-class-properties babel, подробнее об этом ниже.

Смотрите этот вопрос и ответ для более подробной информации:

Альтернативы переменной класса ES6

Технически правильный способ объявить переменную класса — использовать ключевое слово this, например:

class BottomPanel extends React.Component<Props, {}> {
  constructor(props) {
      this.dropDownUpdate = this.dropDownUpdate.bind(this)
  }

   dropDownUpdate(e) {
       this.setState({ dropDownValue: e.currentTarget.textContent });
   }
}

Почему вы не можете просто сделать:

class BottomPanel extends React.Component<Props, {}> {
  constructor(props) {
      this.dropDownUpdate =e => this.setState({ dropDownValue: e.currentTarget.textContent });
  }
}

см. этот пост: Могу ли я использовать функцию стрелки в конструкторе компонента реакции?

Теперь дело в том, что я предполагаю, что вы используете приложение Create React, которое поставляется с плагином transform-class-properties babel, поэтому первое объявление работает.

Взгляните на этот вопрос, чтобы узнать, почему вы хотели бы использовать трюк this.dropDownUpdate = this.dropDownUpdate.bind(this);. В этом нет необходимости, но вы столкнетесь с проблемой отладчика (браузер не знает о преобразовании transform-class-properties babel).

Отладчики Chrome, Firefox не отображают правильное значение для «это» в приложении реакции

В противном случае вы можете просто очистить свои методы класса, например:

class BottomPanel extends React.Component<Props, {}> {
  dropDownUpdate = e => this.setState({ dropDownValue: e.currentTarget.textContent });
}

Другие вопросы по теме