Ваше «this» будет «неопределенным», потому что React вызывает вашу функцию за кулисами, и он doesn't
вызывает ее из экземпляра объекта (IE MyComponent.onClickHandler(e)
), он вызывает ее так: (onClickHandler(e))
Упрощенная модель того, что происходит без участия React, выглядит примерно так .....
class FakeReactComponent {
myName() {
console.log(this);
}
}
// this is what you give a onClick prop on an element.
const functionPassedToOnClick= new FakeReactComponent().myName;
console.log(
functionPassedToOnClick() // this is how react calls it (this is undefined)
)
Метод, позволяющий обойти это, состоит в том, чтобы связать "this" функции в конструкторе компонента IE
constructor(props: IProps) {
super(props);
this.onClickHandler = this.onClickHandler.bind(this);
}
На самом деле это «лучший метод» определения всех функций в пределах class
для компонентов React, поскольку функции стрелок не идут в прототипе классов, и, следовательно, свежие функции создаются для каждого новогоРеагировать на экземпляр этого компонента;однако с функциями, не являющимися стрелками, каждый экземпляр работает с прототипом и, следовательно, повторно используется для каждого экземпляра компонента реакции.
Трюки, такие как autobind, также не являются оптимальной практикой, поскольку привязка this
каждой функции не требуется, поскольку только функции, вызываемыеДля реагирования необходимо, чтобы их this
были связаны и 99% времени использовались только как функции, используемые в качестве обработчиков событий.