🔢 Делаем калькулятор на React c хуками и Context API
Идея для проекта выходного дня – собираем калькулятор на React Hooks и Context API. Осваиваем эти интересные технологии в деле. Приводим пример возможной реализации проекта.
Не бывает лучше проекта в портфолио, чем тот, что можно оценить в действии. Через тернии – к звёздам! Показываем пример простого калькулятора на React с использованием современных технологий. Проект можно и нужно улучшать. Текущий результат
– кликабельная задеплоенная демка (код на GitHub). Ниже некоторые пояснения о выбранных решениях.
Приступим!
Для начала запустим стандартный create-react-app:
Файловая структура и CSS
Файловая структура рассматриваемого приложения выглядит следующим образом:
Если вы хотите точно
следовать примеру, нужно установить Styled Components для CSS:
Файл Calculator.js задает настройки экрана и клавиатуры.
Он содержит следующий код:
Каждый компонент кнопок следует одной базовой структуре. Нулевая кнопка лежит в отдельном div-блоке, так как мы используем для макета грид.
Кстати, о гридах
Если хотите узнать больше о CSS Grid, мы написали несколько статей на эту тему.
Обратите внимание, что свойство
buttonValue необходимо только для NumberButton и FunctionButton.
Создание Context API Provider
NumberProvider.js–
это сердце приложения и место, где наши функции обретают жизнь. Здесь же используется React Context API – отличный инструмент передачи данных между компонентами.
Чтобы передать данные или функции через вложенную структуру компонентов, пришлось
бы попотеть. Обертка из компонента провайдера позволяет передавать данные в любой вложенный компонент независимо от глубины вложенности. Всякий раз, когда нужно получить данные или использовать функцию, находящуюся внутри провайдера, она будет доступна глобально.
Любое переданное значение теперь доступно всем вложенным компонентам. Так что есть всё необходимое для заполнения App.js:
Используем Context Provider
Теперь добавим код для дисплея. Можно выводить значение, передав его в функцию useContext из
нового React Hooks API. Больше не нужно передавать проп через вложенные компоненты.
Число, которое передано
на три уровня выше в NumberProvider, становится сразу же доступным компоненту Display при вызове useContext и передаче созданного нами NumberContext. Цифровой
дисплей теперь включен, работает и отображает number, исходно приравненное нулю.
Начинаем работать с Hooks
Хуки позволяют «облегчить» синтаксис класса и получить
состояние внутри функциональных компонентов. Добавим следующий код в NumberProvider.js, чтобы создать хук:
Вместо написания класса
с состоянием мы разбиваем состояние и переносим каждую его часть в переменную number. Здесь же используется setNumber, действующая, как функция setState. Для инициализации используется useState.
Создание компонента кнопки
Теперь мы можем вызвать функцию с помощью Context API в любом из вложенных компонентов.
Обратите внимание, как
можно начать вводить значения, заданные в NumberProvider, в другие компоненты
приложения с помощью функции useContext. Состояние и функции, влияющие на них,
хранятся в NumberProvider . Просто вызываем определенный контекст – и готово.
Функции провайдера
Завершенный NumberProvider.js находится ниже и содержит следующие функции, которые используются вместе с хуками:
handleSetDisplayValue: задает значение, выводимое на дисплей. Мы проверяем, что в числовой строке есть только один десятичный знак, и ограничиваем длину числа 8 символами. Он передает свойство buttonValue в NumberButton.js.
handleSetStoredValue: принимает строку и сохраняет ее, позволяя ввести другое число.
handleClearValue: сбрасывает всё в 0. Это «функция очистки», которая передается в ClearButton.js.
handleBackButton: позволяет удалять ранее введенные символы по одному, пока вы не вернетесь в 0. Код привязан к BackButton.js.
handleSetCalcFunction: срабатывает при выборе математической функции, передается в FunctionButton.js и в свойства buttonValue.
handleToggleNegative: оперирует отображаемыми или сохраненными значениями, передаваемыми в NegativeButton.js.
Обновим файл для отображения экрана. Он должен показывать number и storedNumber в соответствии с functionType. Еще есть несколько проверок, таких как отображение 0 при вставке пустой строки вместо числа.
Заключение
Библиотека программиста
надеется, что данный материал немного прояснит вопрос о том, как можно
использовать хуки React вместе с Context API. Использование встроенных функций
React дает ряд преимуществ:
простой для понимания синтаксис и отсутствие беспорядка в компонентах класса. Больше никаких super и constructor – просто чистые переменные;
проще устанавливать и использовать состояние внутри компонентов и между ними;
нет необходимости в Redux для небольших проектов.
React Hooks и Context API – отличные
способы упростить приложения React и писать более чистый код. О других технологиях React читайте в нашем руководстве для React-разработчика.