Почему и когда нам нужно связывать функции и EventHandlers в React?

class SomeClass extends Component{
  someEventHandler(event){
  }
  render(){
    return <input onChange={------here------}>
  }
}

Я вижу разные версии ------here------ часть.

// 1
return <input onChange={this.someEventHandler.bind(this)}>

// 2
return <input onChange={(event) => { this.someEventHandler(event) }>

// 3
return <input onChange={this.someEventHandler}>

Чем отличаются версии? Или это просто вопрос предпочтений?


Спасибо всем за ответы и комментарии. Все они полезны, и я настоятельно рекомендую прочитать эту ссылку ПЕРВЫМ, если вы, как и я, запутались в этом.
http://blog.andrewray.me/react-es6-autobinding-and-createclass/

2 ответа

Решение

Каждый отличается, и это зависит от того, как настроен ваш компонент

Первый.bind(this) используется, чтобы связать ваш контекст this с функцией компонентов. Классы React ES6 не привязывают контекст автоматически, поэтому вы должны связывать их явно. Есть несколько способов сделать это и .bind(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') }>

это был бы способ передать дополнительный параметр в функцию-обработчик, если это необходимо.

В-третьих. Вы просто передаете функцию в качестве функции обратного вызова для запуска, когда происходит событие щелчка, без дополнительных параметров

Подвести итоги. Все эти три примера связаны с передачей функции-обработчика событию click. Однако есть и другие вещи, которые вы можете добавить к этому. первое касается твоего this контекст. вторая о том, как передать аргументы в функцию-обработчик.

Зачем связывать функцию React?

Когда вы определяете компонент с использованием класса ES6, общий шаблон для обработчика событий должен быть методом класса. В JavaScript методы класса не связаны по умолчанию. Если вы забудете bind this.someEventHandler и передать его onChange, это будет неопределенным, когда функция на самом деле вызывается.

Как правило, если вы ссылаетесь на метод без () после него, например onChange={this.someEventHandler}, вы должны связать этот метод.

Есть три способа связать ваш onChange функционировать в правильном контексте

Первый

return <input onChange={this.someEventHandler.bind(this)}>

В этом мы используем bind явно для того, чтобы сделать событие onChange доступным в качестве аргумента для eventHandler. Мы также можем отправить другой параметр с типом синтаксиса, например

return <input onChange={this.someEventHandler.bind(this, state.value)}>

второй

return <input onChange={(event) => { this.someEventHandler(event) }>

Это синтаксис ES6, посредством которого мы можем указать параметры, которые мы хотим передать someEventHandler функция. Это эквивалентно .bind(this) Тем не менее, это также дает нам возможность отправлять другие атрибуты вместе с событием, как

return <input onChange={(event, value) => { this.someEventHandler(event, value) }>

В третьих

Определите функцию someEventHandler, используя функцию Arrow

someEventHandler = () => {
    console.log(this); // now this refers to context of React component
}

arrow function не имеет своего this, this используется значение окружающего контекста выполнения, и, следовательно, вышеприведенная функция получает правильный контекст.

или связать его в конструкторе, как

constructor(props) {
   super(props);
   this.someEventHandler = this.someEventHandler.bind(this);
}


return <input onChange={this.someEventHandler}>

В этом методе событие напрямую присоединяется к someEventHandler функция. Никакие другие параметры не могут быть переданы таким образом

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