Обработчик React — каррирование

Привет, кто-нибудь может объяснить мне, как работает это каррирование в примере ниже?

Аргумент имя я мог понять, но событие? Как это делается?

 <TextField
          placeholder = "Name"
          InputLabelProps = {{
            shrink: true,
          }}
          className = {classes.textfield}
          value = {name}
          onChange = {this.handleChangeEvent('name')}
 />

 handleChangeEvent = name => (event) => {
    this.setState({
      [name]: event.target.value,
 });
};

Привет

Это может помочь gist.github.com/amitai10/adb66d6faa714e8c3cdb94946bb98356

Shivam Gupta 13.03.2019 20:19

Ну, event передается, когда обработчик onChange вызывается компонентом TextField.

Bergi 13.03.2019 20:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
387
4

Ответы 4

Подумайте о приведенном ниже коде

handleChangeEvent = name => (event) => {
    this.setState({
      [name]: event.target.value,
 });

так как

constructor() {
   super();
   this.handleChangeEvent = this.handleChangeEvent.bind(this);
}

 handleChangeEvent(name){
   return (event) => {
      this.setState({
        [name]: event.target.value,
       });
   }
}

поэтому в основном вызов handleChangeEvent как this.handleChangeEvent('name') вернет функцию в событие onChange. OnChange при срабатывании вызовет этот метод с аргументом event. Теперь, когда возвращаемая функция образует замыкание с внешней функцией handleChangeEvent, она может использовать переменную name из объемлющей области, как будет работать приведенный выше код с каррированием.

this.handleChangeEvent('name') запускается при инициализации, возвращает функцию и присваивается onChange функции.

(event) => {
  this.setState({
    [name]: event.target.value
  })
}

Теперь то же самое с

<TextField
    ...
    value = {name}
    onChange = {this.handleEvent}
/>
//[name] now become yourName. It's `closure`
handleEvent = (event) => this.setState({yourName: event.target.value})

И event теперь представляет собой TextField, когда вы запускаете функцию.

Функция, вызываемая обработчиком событий, получает в качестве аргумента объект Event. Представьте, что метод addEventListener, реализованный браузерами, выглядит так:

something.addEventListener = (eventName, callback, useCapture) => {
  // Some code here
  // Bla bla bla
  const eventObj = {
    // Event object
  };
 callback(eventObj);
}

something.addEventListener('click', eventObject => {
  // Do something
}, false);

Итак, как вы можете видеть, если используется обычная функция, переменная name будет содержать объект Event вместо фактического имени. Поэтому, используя функцию карри, функция ВОЗВРАЩЕНО этим будет иметь переданный объект Event, готовый к использованию.

В ответ событие в этом случае представляет собой синтетический экземпляр события, передаваемый событиям обработчика. Подробнее об этом здесь. Это позволяет вам получить доступ к значению свойства event.target. В этом примере это событие обработчика просто устанавливает состояние любого значения имени со значением, введенным в текстовое поле. Надеюсь, это прояснит ситуацию!

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