Code Example 1: BrowserRouter setup
❓ Почему BrowserRouter должен оборачивать всё приложение? Что произойдёт, если компонент использует хуки роутера, но находится вне BrowserRouter?
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom';
import App from './App';
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
Code Example 2: Routes definition
❓ Что такое index route? Что означает path="*"? Как работают вложенные маршруты?
import { Routes, Route } from 'react-router-dom';
function App() {
return (
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
<Route path="users" element={<Users />} />
<Route path="users/:userId" element={<UserProfile />} />
<Route path="*" element={<NotFound />} />
</Route>
</Routes>
);
}
Code Example 3: Layout with Outlet
❓ Зачем нужен Outlet? Что будет отображаться внутри <main> при переходе на /about?
import { Outlet, NavLink } from 'react-router-dom';
function Layout() {
return (
<div className="app">
<header>
<nav>
<NavLink
to="/"
className={({ isActive }) => isActive ? 'active' : ''}
>
Главная
</NavLink>
<NavLink
to="/about"
className={({ isActive }) => isActive ? 'active' : ''}
>
О нас
</NavLink>
</nav>
</header>
<main>
<Outlet />
</main>
</div>
);
}
Code Example 4: useParams and useNavigate
❓ Как получить параметр из URL? В чём разница между navigate('/users') и navigate(-1)?
import { useParams, useNavigate } from 'react-router-dom';
function UserProfile() {
const { userId } = useParams<{ userId: string }>();
const navigate = useNavigate();
const handleBack = () => {
navigate('/users');
};
return (
<div>
<button onClick={handleBack}>← Назад к списку</button>
<h1>Профиль пользователя #{userId}</h1>
</div>
);
}
Code Example 5: Link navigation
❓ В чём разница между относительным и абсолютным путём в Link? Что получится для каждого варианта?
import { Link } from 'react-router-dom';
const users = [
{ id: '1', name: 'Алексей' },
{ id: '2', name: 'Мария' },
];
function Users() {
return (
<ul>
{users.map(user => (
<li key={user.id}>
<Link to={user.id}>{user.name}</Link>
{/* <Link to={`/users/${user.id}`}>{user.name}</Link> */}
</li>
))}
</ul>
);
}
Code Example 6: Router hooks
❓ Объясните назначение каждого хука. Как получить query-параметр из URL?
import { useParams, useNavigate, useLocation, useSearchParams } from 'react-router-dom';
// URL: /search?query=react&page=2
function SearchPage() {
const [searchParams, setSearchParams] = useSearchParams();
const query = searchParams.get('query');
const page = searchParams.get('page');
const handleNextPage = () => {
setSearchParams({
query: query || '',
page: String(Number(page) + 1),
});
};
return (
<div>
<p>Поиск: {query}, страница: {page}</p>
<button onClick={handleNextPage}>Следующая</button>
</div>
);
}
Code Example 7: Passing state on navigation
❓ Как передать данные между страницами без URL-параметров? Как получить переданные данные?
const navigate = useNavigate();
navigate('/checkout', {
state: { from: 'cart', items: cartItems }
});
<Link to="/checkout" state={{ from: 'cart', items: cartItems }}>
Оформить
</Link>
const location = useLocation();
const { from, items } = location.state || {};
Code Example 8: Navigate component for redirect
❓ Чем Navigate отличается от useNavigate? Зачем нужен replace?
import { Navigate } from 'react-router-dom';
<Route path="/old-path" element={<Navigate to="/new-path" replace />} />
function ProtectedPage() {
const { isLoggedIn } = useAuth();
if (!isLoggedIn) {
return <Navigate to="/login" replace />;
}
return <Dashboard />;
}