** ОБНОВЛЕНИЕ: json-сервер, который я разместил на Heroku для сохранения результатов дуэлей, был закрыт, так как Heroku перестал предлагать freemium. По этой причине функция истории отсутствует на данный момент. Я сейчас подключаю приложение к сервису Google Cloud Firestore, чтобы восстановить его функциональность. КОНЕЦ ОБНОВЛЕНИЯ**

Обзор

React.Js — это мощная библиотека JavaScript, которая использует декларативное программирование и позволяет нам, разработчикам, писать краткий код и уделять больше внимания функциональности, а не императивному объявлению всего. На этапе 2: React в Академии Си я изучил основы React.Js и применил их в своем первом проекте: Волшебная дуэль. Перейдите на его страницу GitHub, если хотите углубиться.

Что такое Волшебная дуэль?

Wizarding Duel — это одностраничное приложение (SPA), которое позволяет пользователю выбрать двух волшебников из доступного списка персонажей вселенной Гарри Поттера, заставить их пройти 3 дуэльных раунда. Каждый раунд дуэли прост: каждому дуэлянту назначается случайное заклинание, и с соответствующим количеством очков заклинаний их общее количество очков накапливается с каждым раундом, и в результате персонаж получает больше очков как победитель, если только в случае ничьей . Пользователь может сохранить исход дуэли, если пожелает. Довольно просто, верно? Давайте прыгнем в это!

Результаты обучения

В Wizarding Duel я практиковал следующее:

  • Создание одностраничного приложения React с нуля с помощью create-react-app
  • Использование компонентов, реквизита и управление состоянием
  • Включение маршрутизации на стороне клиента, включая 3 маршрута и вложенный маршрут
  • Использование данных из внешнего API для персонажей и заклинаний Гарри Поттера
  • Использование json-сервера для создания бэкэнда для сохраненных результатов дуэли. Компонент контролируемой формы использовался для выполнения запроса POST.
  • Использование стилей Styled Components, ThemeProvider и GlobalStyles

Путь жизненного цикла проекта

Крепление (1/4) Компонентная структура

Каждому компоненту была назначена собственная папка внутри папки src. Возьмем, к примеру, папку компонента CharacterCard:

src
- CharacterCard
---- CharacterCard.jsx
---- CharacterCard.styled.js
---- index.js
.
.
.
- index.js

CharacterCard.jsx содержит логику компонента. Он принимает реквизиты и возвращает jsx. CharacterCard.styled.js содержит стили для нашего компонента благодаря Styled Components. Затем index.js позаботится об экспорте компонента CharacterCard. Что это дает, спросите вы? Следуя одному и тому же соглашению для всех компонентов, index.js (всего на один уровень ниже src) экспортирует все наши компоненты, а затем мы можем просто импортировать все наши компоненты по мере необходимости из одного файла!

Смонтировать (2/4) Маршрутизация на стороне клиента

Для выполнения маршрутизации на стороне клиента, начиная с App.js, использовалась популярная библиотека react-router-dom. Для страниц Home, Duel и History были установлены три клиентских маршрута. Действия пользователя, обеспечивающие навигацию, допустимы через компоненты Link (из react-router-dom), размещенные на панели навигации.

Страница «Дуэль» также перенаправляет пользователя на домашнюю страницу через компонент «Ссылка», если он не выбрал двух персонажей.

Я также включил вложенный маршрут для начала дуэли.

https://wizarding-duel.netlify.app/duel/start

Гора (3/4) Тематика и глобальные стили

Styled Components предоставляет удобную функцию createGlobalStyles для создания глобальных стилей, доступных для всего приложения. Компоненты в App.js внутри компонента ‹GlobalStyles/›.

Еще одним мощным инструментом от Styled Components является компонент ‹ThemeProvider/›, который принимает объект темы в качестве реквизита. Объект темы содержит пары ключ-значение цветовых переменных. Чтобы сделать нашу тему доступной во всем приложении, я обернул все компоненты, включая глобальные стили, внутри ThemeProvider. Теперь есть только один источник правды для цветовой системы.

Mount (4/4) Пользовательский хук для получения данных

Поскольку приложение извлекает данные из трех конечных точек API для заклинаний Гарри Поттера, персонажей Гарри Поттера и сохраненных дуэлей, это указывало на будущий запах кода. Пытаясь сохранить свой код СУХИМ, я создал специальный хук useQuery для своих GET-запросов. Пользовательский хук использует useEffect, который срабатывает каждый раз при изменении переданного URL-адреса и возвращает массив данных.

В разделах «Жизнь» я в основном буду касаться того, что увидит пользователь, и их взаимодействия.

Life (1/3) Функциональность домашней страницы

На главной странице пользователь увидит список символов, отображаемых в формате карты. У каждого персонажа будут некоторые личные данные, а также связанный с ним цвет дома. Пользователю будет предложено выбрать два символа. После выбора появится ссылка для начала дуэли, которая перенаправляет пользователя на страницу дуэли. В противном случае у пользователя есть возможность сделать выбор еще раз.

Жизнь (2/3) Функциональность страницы дуэли

Поединок состоит из 3 раундов. В каждом раунде каждый дуэлянт использует случайное заклинание. Заклинание имеет связанное количество очков. Счетчик очков отображается для обоих дуэлянтов. После раундов станет известен исход дуэли. Пользователь может сохранить результат дуэли вместе с комментарием.

Жизнь (3/3) Функциональность страницы истории

Страница истории просто показывает результаты дуэлей, сохраненные пользователем. Отображается информация о дуэлянтах (имя и изображение), сообщение о победителе/ничье, комментарий, а также дата и время сохранения.

Размонтировать -> Следующие шаги

Поскольку я завершил проект на удовлетворительном уровне, есть несколько изменений/улучшений, которые находятся в стадии разработки, чтобы улучшить общее качество кода. Некоторые из них:

Используйте React Context, чтобы избежать чрезмерного детализации свойств: я заметил, что я передаю множество свойств по дереву компонентов, и большую часть времени я имею в виду одни и те же комбинации свойств. Контекст был бы удобной альтернативой глобальному распространению моего реквизита.

Улучшенное управление файлами. Требуется дополнительное управление файлами, поскольку компоненты находятся на одном уровне в папке src, что замедляет мой рабочий процесс, когда я ищу определенный компонент. Было бы целесообразно классифицировать их в соответствии с компонентами навигации, страниц и пользовательского интерфейса.