Проект представляет из себя магазин по продаже наушников.
- Разработка с использованием React, React Router, с двумя страницами интернет-магазина: каталог товаров и корзина.
- Реализация удобного и масштабируемого роутинга.
- Все элементы ссылок и иконок отзываются при наведении на них.
- Реализация перехода с корзины обратно на главную страницу через логотип или кнопку возврата.
- При нажатии на кнопку "Купить" в карточке товара на первой странице увеличивается счетчик товаров рядом с иконкой корзины.
- При изменении количества товаров в корзине обновляется сумма и количество товаров.
- Хранение данных о каждом товаре в виде элемента массив
- Возможность удалять карточку товара из корзины товаров;
- Добавил интернационализацию (смену языков)
- Адаптивность на все устройства
- Реализовать «Переход к оформлению» на отдельную страницу с формой оплаты или модальное окно с формой оплаты;
- Реализовать модальное окно с подробной информацией о товаре, добавить в карточку иконку просмотра на свой выбор, которая будет открывать данное модальное окно
- Добавил страницу избранное
- Страница "Условия использования"
- Страница "Контакты"
Основной файл для роутинга - src/shared/configs/routerConfig/routerConfig.ts
В нем находятся следующие переменные:
// енам для хранения всех роутов
export enum Routes {
MAIN = 'main',
CART = 'cart',
FAVOURITES = 'favourites',
TERMS = 'terms',
CONTACTS = 'contacts',
NOT_FOUND = 'not_found',
}
// объект для хранения путей для роутов
export const RoutesPaths: Record<Routes, string> = {
[Routes.CART]: '/cart',
[Routes.FAVOURITES]: '/favourites',
[Routes.TERMS]: '/terms',
[Routes.CONTACTS]: '/contacts',
[Routes.MAIN]: '/',
[Routes.NOT_FOUND]: '*',
};
// объект для хранения настроек роутов
export const RoutesConfig: Record<Routes, RouteProps> = {
[Routes.MAIN]: {
path: RoutesPaths.main,
element: <MainPage />,
},
[Routes.CONTACTS]: {
path: RoutesPaths.contacts,
element: <ContactsPage />,
},
[Routes.TERMS]: {
path: RoutesPaths.terms,
element: <TermsPage />,
},
[Routes.CART]: {
path: RoutesPaths.cart,
element: <CartPage />,
},
[Routes.FAVOURITES]: {
path: RoutesPaths.favourites,
element: <FavouritesPage />,
},
[Routes.NOT_FOUND]: {
path: RoutesPaths.not_found,
element: <ErrorPage />,
},
};
Далее в файле src/app/providers/RouterProvider/ui/RouterProvider.tsx
создаем роуты следующим образом
export const RouterProvider = () => {
return (
<Routes>
{Object.values(RoutesConfig).map((route) => {
return (
<Route
key={route.path}
path={route.path}
element={route.element}
/>
);
})}
</Routes>
);
};
В итоге, благодаря такому хранению роутов, мы легко можем добавлять новые страницы в приложение.
- Установите все зависимости, запустив команду:
npm install
- Запустите локальный сервер разработки с помощью следующей команды:
npm run dev
- Соберите проект, выполните следующие команды:
npm run build
Эта команда сначала выполнит компиляцию TypeScript кода, а затем соберет проект для продакшн с использованием Vite.
- Запустите предпросмотр собранного проекта:
npm run preview
Вот основные зависимости проекта:
react
: 18.2.0react-dom
: 18.2.0react-router-dom
: 6.22.3zustand
: 4.5.2typescript
: 4.5.2
При построении приложения ориентирвоался на FSD. Однако в целях экономия времени некоторые моменты игнорировал.
Есть 6 основных слоев
- app
- entities
- features
- pages
- shared
- widgets
Каждый слой состоит из слайсов. Например
Entities ( слой )
└
cart ( слайс )
└ model ( бизнес-логика слайса, напр.: стор, типы, селекторы )
└ selectors.ts
└ store.ts
└ types.ts
└ ui ( все необходимые юай компоненты для слайса )
└ CartIcon
└ CartList
└ CartTotal
└ CartItem
└ CartItem.tsx
└ CatrItem.module.css
└ index.ts (паблик апи для слайса)
Cлой кода общего использования
shared/assets
- место, куда складывались все изображения\svg
shared/configs
- различные конфиги (интернационализации и роутера)
shared/lib
- сторонние функции, в рамках проекта там хранится функция для создания селекторов для сторов
shared/ui
- общие юай компоненты для всего приложения
настройки, стили и провайдеры для всего приложения.
бизнес-сущности. (например, cart, product, favourites)
Действия, несущие бизнес-ценность. Именно этот слой в данном проекте был упрощен и туда была помещена лишь модалка для оплаты корзины. Многие другие действия, например, добавить элемент в корзину/избранное я решил туда не добавлять, чтобы не усложнять проект
композиционный слой для соединения сущностей и фич в самостоятельные блоки
композиционный слой для сборки полноценных страниц