Ответ 1
Связывание - это не то, что определено для React, а скорее как this
работает в Javascript. Каждая функция/блок имеет свой собственный контекст, для функций он более специфичен для того, как он вызывается. Команда Реагировать приняла решение для this
, чтобы не быть связанным с пользовательскими методами на классе (ака а не встроенные методы, как componentDidMount
), при добавлении поддержки ES6 (класс синтаксиса).
Когда вам нужно связать контекст, это зависит от назначения функций, если вам нужен доступ к реквизитам, состоянию или другим членам класса, вам нужно будет связать его.
Для вашего примера, каждый отличается и зависит от того, как настроен ваш компонент.
Предварительная привязка к вашему классу
.bind(this)
используется для привязки контекста this к функции ваших компонентов. Тем не менее, он возвращает новую ссылку на функцию каждый цикл рендеринга! Если вы не хотите связывать каждое использование функции (как в обработчике кликов), вы можете предварительно связать функцию.
а. в вашем конструкторе сделайте привязку. ака
class SomeClass extends Component{
constructor(){
super();
this.someEventHandler = this.someEventHandler.bind(this);
}
someEventHandler(event){
}
....
}
б. сделайте свои пользовательские функции на функции жирной стрелки класса. ака
class SomeClass extends Component{
someEventHandler = (event) => {
}
....
}
Привязка времени выполнения к вашему классу
несколько распространенных способов сделать это
а. Вы можете обернуть свою функцию обработчика компонентов с помощью встроенной функции лямбда (жирная стрелка).
onChange={(event) => { this.someEventHandler(event) }
это может обеспечить дополнительную функциональность, например, если вам нужно передать дополнительные данные для обработчика щелчка <input onChange={(event) => { this.someEventHandler(event, 'username') }>
. То же самое можно сделать с bind
б. Вы можете использовать .bind(this)
как описано выше.
onChange={this.someEventHandler.bind(this) }
с дополнительными параметрами <input onChange={this.someEventHandler.bind(this, 'username') }>
Если вы хотите избежать создания новой ссылки на функцию, но все же должны передать параметр, лучше абстрагировать его от дочернего компонента. Вы можете прочитать больше об этом здесь
В твоих примерах
// 1
return <input onChange={this.someEventHandler.bind(this)}>
Это просто привязка обработчика событий во время выполнения к вашему классу.
// 2
return <input onChange={(event) => { this.someEventHandler(event) }>
Еще одна привязка времени выполнения к вашему классу.
// 3
return <input onChange={this.someEventHandler}>
Вы просто передаете функцию в качестве функции обратного вызова для запуска, когда происходит событие щелчка, без дополнительных параметров. Не забудьте предварительно связать это!
Подвести итоги. Хорошо подумать о том, как оптимизировать ваш код, у каждого метода есть полезность/назначение в зависимости от того, что вам нужно.