Крючки классные. Что ж, я полагаю, это зависит от того, о каком крючке вы говорите, поэтому позвольте мне немного пояснить. Перехватчики React потрясающие. Они упрощают наши компоненты реакции и чрезвычайно мощны и разнообразны. Возможно, вы пробовали ловить хуки, используя такие вещи, как useState и useEffect, или, может быть, вы уже опытный специалист по хукам! В любом случае, я надеюсь, что смогу поделиться с вами новым и уникальным способом упростить (на мой взгляд) ваши формы в ответ с помощью ловушки useReducer. useReducer становится тем мощнее, чем больше и сложнее ваша форма, но все же может помочь упростить код в небольших формах. В этой статье мы будем использовать эту форму в качестве примера:

Если вы новичок в хуках, не беспокойтесь, я постараюсь вас познакомить, прежде чем мы перейдем к использованию useReducer. Если вы уже являетесь профессионалом, ищущим новый инструмент, перейдите к разделу useReducer ниже.

Репо для этой демонстрации можно найти здесь:



Не стесняйтесь форкнуть и клонировать его на свой локальный компьютер и немного поиграйте! Проведите небольшое тестирование, чтобы увидеть, какой стиль формы вам больше всего нравится.

useState против компонентов класса

Если вы никогда раньше не использовали хуки, вы, вероятно, пишете формы в компонентах класса с отслеживанием состояния. Код для приведенной выше формы может выглядеть примерно так:

Здесь все значения формы хранятся в состоянии и отслеживаются с помощью handleFormChange. Это все очень хорошо, но я предполагаю, что вы здесь не для того, чтобы изучать компоненты классов в React. Итак, перейдем к крючкам!

Чтобы написать ту же форму в функциональном компоненте с использованием useState, ваш код может выглядеть примерно так:



Выше ссылка на официальную документацию React по хукам. Здесь вы можете прочитать обо всех преимуществах крючков.

Это выглядит намного чище, чем компонент класса выше. Давайте разберемся, что здесь происходит. useState - это функция, которая принимает один аргумент: начальное состояние. Он возвращает значение этого начального состояния и функцию, которая может его обновить. Мы можем разобраться в этом, взглянув на один из приведенных выше примеров.

const [firstName, setFirstName] = useState('')

Здесь начальное состояние - пустая строка, переменная, присвоенная этому значению, называется firstName, а функция для обновления этой переменной называется setFirstName. Чтобы уточнить подробности, посмотрите на этот фрагмент кода:

Если вы все еще следуете остальной части формы, становится довольно просто. Вместо вызова setState каждый раз при изменении формы вызывается конкретная функция обновления, возвращаемая из useState, и обновляется соответствующая переменная. Теперь давайте посмотрим, как создать такую ​​же форму с помощью хука useReducer.

useReducer

Вот как вы можете создать форму выше, используя ловушку useReducer:



Выше представлена ​​официальная документация для useReducer. Иди туда, чтобы узнать больше!

Итак, давайте разберемся, что происходит наверху. Вместо того, чтобы иметь несколько переменных состояния, как в случае с useState, мы создаем объект initialValues ​​. Это действует как наше начальное состояние. useReducer принимает два аргумента (может потребоваться больше, подробнее см. выше). Первый из этих аргументов - функция-редуктор. Второе - это исходное состояние. useReducer возвращает пару точно так же, как useState. Начальное состояние и функция, которая вызовет вашу функцию-редуктор. Итак, formValues ​​ становится нашим контейнером для состояния, а setFormValues ​​ становится нашей функцией обновления.

setFormValues ​​ вызовет нашу функцию-редуктор с автоматически переданным текущим состоянием (т. е. formValues), а также с любыми предоставленными нами аргументами. Благодаря оператору распространения, используемому в нашей функции редуктора, мы можем просто передать атрибут name из нашей формы и обновленное значение и обновить наши formValues ​​ объект. Использование useReducer позволяет нам хранить все значения формы в одном объекте. Это может быть полезно, если вы публикуете значения формы в API или передаете их в другой компонент. Вам не нужно создавать новый объект, используя все ваши переменные useState. Он также упрощает любые обновления нашего объекта formValues ​​, выполняя эти обновления в одной центральной функции.

Итак, вот оно что! Три возможных способа работы с формами в React. Как и у всех вещей в коде, у каждого есть свои преимущества и недостатки. Я рекомендую вам протестировать их самостоятельно и выяснить, какой из них лучше всего подходит для вас.