Для полноценного использования Chakra UI вместе с маршрутизацией на базе React Router необходимо убедиться, что проект содержит все необходимые зависимости:
npm install @chakra-ui/react @emotion/react @emotion/styled framer-motion react-router-dom
После установки подключается ChakraProvider в корневом компоненте приложения, чтобы обеспечить доступ ко всем компонентам Chakra UI и глобальным темам:
import { ChakraProvider } from '@chakra-ui/react';
import { BrowserRouter as Router } from 'react-router-dom';
import App from './App';
function Root() {
return (
<ChakraProvider>
<Router>
<App />
</Router>
</ChakraProvider>
);
}
export default Root;
Важно: порядок обёрток имеет значение — Router должен быть внутри ChakraProvider, чтобы стили и темы корректно применялись к маршрутизируемым компонентам.
Часто возникает необходимость стилизовать ссылки маршрутизации. В
Chakra UI для этого подходит компонент Link, но чтобы
он корректно работал с маршрутизацией, используется комбинация с
react-router-dom:
import { Link as ChakraLink, Button } from '@chakra-ui/react';
import { Link as RouterLink } from 'react-router-dom';
<ChakraLink as={RouterLink} to="/about">
Перейти на страницу About
</ChakraLink>
<Button as={RouterLink} to="/contact" colorScheme="teal">
Контакты
</Button>
as={RouterLink} позволяет Chakra UI использовать
функциональность React Router, сохраняя возможности стилизации.as может быть
превращён в ссылку маршрутизации.React Router предоставляет компоненты Routes и Route для определения маршрутов:
import { Routes, Route } from 'react-router-dom';
import Home from './pages/Home';
import About from './pages/About';
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
Компоненты Chakra UI легко интегрируются в маршрутизируемые страницы:
import { Box, Heading, Text, Button } from '@chakra-ui/react';
function Home() {
return (
<Box p={8}>
<Heading>Главная страница</Heading>
<Text mt={4}>Добро пожаловать на главную страницу.</Text>
<Button mt={6} colorScheme="blue" as={RouterLink} to="/about">
Узнать больше
</Button>
</Box>
);
}
Для динамических маршрутов React Router использует параметры в пути:
<Route path="/profile/:userId" element={<Profile />} />
Внутри компонента можно получать параметры через хук useParams:
import { useParams } from 'react-router-dom';
import { Box, Heading, Text } from '@chakra-ui/react';
function Profile() {
const { userId } = useParams();
return (
<Box p={6}>
<Heading>Профиль пользователя</Heading>
<Text mt={4}>ID пользователя: {userId}</Text>
</Box>
);
}
Это позволяет создавать страницы, стилизованные компонентами Chakra UI, с полностью динамическим контентом на основе маршрутов.
Для построения навигационного меню удобно использовать Flex, HStack и Button:
import { Flex, HStack, Button } from '@chakra-ui/react';
import { Link as RouterLink } from 'react-router-dom';
function Navbar() {
return (
<Flex as="nav" bg="gray.100" p={4} justify="space-between">
<HStack spacing={4}>
<Button as={RouterLink} to="/" variant="ghost">Главная</Button>
<Button as={RouterLink} to="/about" variant="ghost">О нас</Button>
<Button as={RouterLink} to="/contact" variant="ghost">Контакты</Button>
</HStack>
</Flex>
);
}
variant="ghost" делает кнопки минималистичными,
сохраняя фокус на контенте.React Router v6 поддерживает вложенные маршруты с
Outlet. Chakra UI можно использовать для создания обёрток и
макетов:
import { Outlet } from 'react-router-dom';
import { Box } from '@chakra-ui/react';
function Layout() {
return (
<Box>
<Navbar />
<Box p={6}>
<Outlet />
</Box>
</Box>
);
}
Маршруты настраиваются с использованием element для
вложенных компонентов:
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
<Route path="contact" element={<Contact />} />
</Route>
</Routes>
Такое решение упрощает организацию макета и позволяет применять единый стиль и отступы ко всем страницам.
Для мобильных устройств удобно использовать Drawer для бокового меню:
import { Drawer, DrawerOverlay, DrawerContent, DrawerBody, Button } from '@chakra-ui/react';
import { Link as RouterLink } from 'react-router-dom';
function MobileMenu({ isOpen, onClose }) {
return (
<Drawer isOpen={isOpen} placement="left" onCl ose={onClose}>
<DrawerOverlay />
<DrawerContent>
<DrawerBody>
<Button as={RouterLink} to="/" w="100%" onCl ick={onClose}>Главная</Button>
<Button as={RouterLink} to="/about" w="100%" onCl ick={onClose}>О нас</Button>
</DrawerBody>
</DrawerContent>
</Drawer>
);
}
Chakra UI интегрирован с framer-motion, что позволяет плавно анимировать переходы между страницами:
import { motion } from 'framer-motion';
import { Box } from '@chakra-ui/react';
const MotionBox = motion(Box);
function Home() {
return (
<MotionBox
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
p={6}
>
<Heading>Главная страница</Heading>
<Text mt={4}>Плавная анимация при загрузке страницы.</Text>
</MotionBox>
);
}
Chakra UI предоставляет гибкую систему тем, которая сохраняется на всех страницах:
import { extendTheme, ChakraProvider } from '@chakra-ui/react';
const theme = extendTheme({
colors: {
brand: {
100: "#f7caca",
500: "#e53e3e",
},
},
fonts: {
heading: "Roboto, sans-serif",
body: "Inter, sans-serif",
},
});
<ChakraProvider theme={theme}>
<Router>
<App />
</Router>
</ChakraProvider>
Эта интеграция позволяет создавать полностью стилизованные и структурированные приложения на React с Chakra UI, обеспечивая удобную навигацию, динамические маршруты, адаптивность и анимации, сохраняя при этом единый дизайн на всех страницах.