Функции стрелок для ранних привязок в классах официально не поддерживаются текущим ECMAScript.
Использование функций стрелок в качестве методов класса доставит вам неприятности , когда ваш класс наследуется, и ребенок хочет переопределить родительский метод.
Тем не менее, я бы сказал, что использовать их в ваших компонентах реагирования довольно безопасно, поскольку у вас не возникнет проблем с наследованием, поскольку с помощью реакции вы обычно не будете наследовать от своих собственных компонентов (см. Состав против Наследование ):
В Facebook мы используем React в тысячах компонентов, и мы не нашли случаев использования, в которых мы бы рекомендовали создавать иерархии наследования компонентов.
Дэн Абрамов использует функции стрелок и в компонентных методах, однако он рекомендует использовать его, только если требуется раннее связывание.
Хотя это все еще экспериментально, по моему опыту, это решает проблему довольно хорошо. Это совсем не относится к React: я считаю его полезным в любых классах, которые имеют дело с асинхронностью и обратными вызовами, потому что проблема связывания является общей для всего JavaScript, а не только для React. Мы включили это предложение синтаксиса во всей кодовой базе Facebook, и если оно будет удалено или изменено, мы обязательно выпустим автоматический кодовый мод для перехода на новый синтаксис (или, в худшем случае, преобразуем его обратно в вызовы связывания в конструкторе) .
Однако, как отмечает Дэн, чтобы быть на безопасном сайте, придерживайтесь раннего связывания в конструкторах:
Если вы хотите придерживаться языкового стандарта, ручное связывание в
Конструктор это путь. Это утомительно, но обычно вы хотите только
сделать это для обработчиков событий, и по соглашению вы начинаете их с
обрабатывать * в React, так что не сложно запомнить их.
Обновление: относительно вашего дела:
В вашем случае вы можете использовать решение, предоставленное Anshul Bansal, в котором вы передаете имя поля в handleBlur
и используете переменную поля в вашем закрытии, когда вы передаете возвращенную функцию в качестве обратного вызова события.
Или вы можете напрямую получить доступ к имени ввода поля через evt.target
(код не проверен).
handleBlur = evt => {
const field = evt.target.name;
this.setState({
touched: { ...this.state.touched, [field]: true }
});