Если вы читаете Основные понятия из документов, это объясняется в разделе Обработка событий .
You have to be careful about the meaning of this in JSX callbacks. In JavaScript, class methods are not bound by default
. Подробнее об автобоксе на MDN
Также arrow functions
не имеет собственного this
. ( MDN ) Поэтому, когда вы делаете this.addtoFavorites.bind(this)
, this
не может быть привязан к.
Итак, возможные способы обработки событий (согласно документации):
Определить обработчики как обычные функции javascript и связать в конструкторе , так что в вашем случае
constructor(props) {
// This binding is necessary to make `this` work in the callback
this.addtoFavorites = this.addtoFavorites.bind(this);
}
function addtoFavorites (ev) {
используя синтаксис экспериментальных открытых полей класса вы можете использовать поля класса для правильной привязки обратных вызовов (не уверен, что это все еще экспериментально):
// This syntax ensures `this` is bound within handleClick.
// Warning: this is *experimental* syntax.
addtoFavorites = (ev) => {
...
с использованием функции стрелки в обратном вызове
addtoFavorites = (ev) => {
onClick={(e) => this.addtoFavorites(e)}
Обратите внимание, однако, если вы используете это решение (из документов): Проблема с этим синтаксисом заключается в том, что каждый раз при рендеринге LoggingButton создается другой обратный вызов. В большинстве случаев это нормально. Однако, если этот обратный вызов передается в качестве поддержки более низким компонентам, эти компоненты могут выполнить дополнительный повторный рендеринг.
React рекомендует использовать решение binding
.
Мы обычно рекомендуем связывание в конструкторе или использование синтаксиса полей класса, чтобы избежать такого рода проблем с производительностью.