React как использовать useState для объектов
Как манипулировать объектами в состоянии React хуков, используя TypeScript
Задача на самом деле очень популярная, так как React компоненты зачастую состоят из нескольких элементов, и манипулировать нужно не одним элементом, а несколькими. Создавать для каждого отдельного компонента отдельный хук состояния не хотелось бы. Хук useState из “коробки” предоставляет возможность читать и изменять состояние примитивного кусочка, такого как строка, цифра, флаг.
|
|
В примере выше я создаю React компонент который отрисовывает цифру в h1 элементе. А так же тут есть и не большая динамика, при клике по этому заголовку счетчик увеличивается. Это и есть канонический пример использования этого хука в документации. Далее рассмотрим более сложный пример:
|
|
По задумке автора это бы “калькулятор”. Компонент который считает сумму 2 чисел введенных в калькулятор. Но тут есть несколько проблем первая очевидная, если выпольнить этот код в браузере, то сумма 1 и 2 будет равна 12 вместо 3, потому что JS будет считать типы данных считанных с input строками несмотря на type=“number”. Чтобы решить эту проблему нужно использовать valueAsNumber свойство input элемента вместо обычного value или же функцию parseInt/parseFloat для приобразования строк в числа. Самое интересное на что я бы хотел обратить внимание тут что если у нас не 2 числа а множество, не один кусок состояния, а что если нам нужно как либо образом валидировать состояние осуществлять трансформации в стиле строка в число? Для ответа на эти вопросы рассмотрим следующий пример
|
|
В этом примере исправлены обе проблемы из предидущего примера и в тоже время теперь мы не создаем множество хуков а используем только один useReducer. Этот хук позволяет реагировать на изменения состояния составных объектов, при этом он знает о предидущем состоянии что позволяет менять состояние частично, вместо передачи всего состояния в случае useState:
|
|
А так же внутри функции редюсера можно проводить трансформации и валидации нового состояния перед его изменением.
На этом все надеюсь этот трюк поможет вам в написании кода.