Code Example 1: Basic routing setup v6
❓ Объясните структуру маршрутизации. Что произойдёт при переходе на /about?
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<nav>
<Link to="/">Главная</Link>
<Link to="/about">О нас</Link>
<Link to="/users">Пользователи</Link>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/users" element={<Users />} />
<Route path="*" element={<NotFound />} />
</Routes>
</BrowserRouter>
);
}
Code Example 2: Route component v6 vs v5
❓ В чём разница между синтаксисом v5 и v6? Как определяются вложенные маршруты?
v6:
<Route path="/users" element={<Users />} />
<Route path="/users/:userId" element={<UserProfile />} />
<Route path="/dashboard" element={<Dashboard />}>
<Route path="settings" element={<Settings />} />
<Route path="profile" element={<Profile />} />
</Route>
v5:
<Route path="/users" component={Users} />
<Route path="/about" render={() => <About title="О нас" />} />
<Route path="/users/:userId" component={UserProfile} />
Code Example 3: Link and NavLink
❓ Чем NavLink отличается от Link? Зачем использовать Link вместо обычного <a href>?
import { Link, NavLink } from 'react-router-dom';
function Navigation() {
return (
<nav>
<Link to="/home">Главная</Link>
<Link
to={{
pathname: '/search',
search: '?query=react',
}}
>
Поиск
</Link>
<NavLink
to="/about"
className={({ isActive }) =>
isActive ? 'nav-link active' : 'nav-link'
}
>
О нас
</NavLink>
</nav>
);
}
Code Example 4: useParams hook
❓ Как получить динамические параметры из URL? Что вернёт useParams для URL /users/123?
import { useParams } from 'react-router-dom';
function UserProfile() {
const { userId } = useParams<{ userId: string }>();
return <div>Профиль пользователя: {userId}</div>;
}
// Маршрут
<Route path="/users/:userId" element={<UserProfile />} />
Code Example 5: Programmatic navigation
❓ Чем useNavigate (v6) отличается от useHistory (v5)? Как вернуться на предыдущую страницу?
v6:
import { useNavigate } from 'react-router-dom';
function LoginForm() {
const navigate = useNavigate();
const handleSubmit = async (data: FormData) => {
await login(data);
navigate('/dashboard');
};
const handleCancel = () => {
navigate(-1);
};
}
v5:
import { useHistory } from 'react-router-dom';
function LoginForm() {
const history = useHistory();
const handleSubmit = async (data: FormData) => {
await login(data);
history.push('/dashboard');
};
const handleCancel = () => {
history.goBack();
};
}
Code Example 6: Nested routes with Outlet
❓ Зачем нужен компонент Outlet? Что произойдёт, если его не указать в DashboardLayout?
<Routes>
<Route path="/dashboard" element={<DashboardLayout />}>
<Route index element={<DashboardHome />} />
<Route path="settings" element={<Settings />} />
<Route path="profile" element={<Profile />} />
</Route>
</Routes>
function DashboardLayout() {
return (
<div className="dashboard">
<Sidebar />
<main>
<Outlet />
</main>
</div>
);
}
Code Example 7: Protected route
❓ Как работает защищённый маршрут? Зачем сохраняем location в state?
import { Navigate, useLocation } from 'react-router-dom';
function ProtectedRoute({ children }: { children: JSX.Element }) {
const { isAuthenticated } = useAuth();
const location = useLocation();
if (!isAuthenticated) {
return <Navigate to="/login" state={{ from: location }} replace />;
}
return children;
}
<Route
path="/dashboard"
element={
<ProtectedRoute>
<Dashboard />
</ProtectedRoute>
}
/>
Code Example 8: Lazy loading routes
❓ Зачем использовать lazy loading для маршрутов? Почему нужен Suspense?
import { lazy, Suspense } from 'react';
import { Routes, Route } from 'react-router-dom';
const Dashboard = lazy(() => import('./pages/Dashboard'));
const Settings = lazy(() => import('./pages/Settings'));
function App() {
return (
<Suspense fallback={<Loading />}>
<Routes>
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/settings" element={<Settings />} />
</Routes>
</Suspense>
);
}