React Router — это библиотека для организации маршрутов в приложениях на React, позволяющая управлять отображением компонентов в зависимости от URL. Основной концепцией является сопоставление путей с компонентами.
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './Home';
import About from './About';
function App() {
return (
} />
} />
);
}
BrowserRouter отвечает за синхронизацию URL с историей
браузера.Routes содержит все маршруты приложения.Route описывает путь (path) и компонент
для рендеринга (element).React Router позволяет использовать параметры в URL, что особенно полезно для страниц деталей, профилей и товаров.
} />
:id — параметр маршрута.useParams():import { useParams } from 'react-router-dom';
function UserProfile() {
const { id } = useParams();
return Профиль пользователя с ID: {id};
}
Для перехода между страницами используется компонент
Link и хук useNavigate.
import { Link, useNavigate } from 'react-router-dom';
function Navigation() {
const navigate = useNavigate();
const goToHome = () => {
navigate('/');
};
return (
О сайте
);
}
Link создает ссылку, которая не перезагружает
страницу.useNavigate позволяет программно изменять маршрут.Иногда требуется предотвратить случайный уход со страницы с несохраненными изменениями. Для этого в React Router используется механизм промптов подтверждения.
usePromptimport { useEffect } from 'react';
import { unstable_useBlocker as useBlocker } from 'react-router-dom';
function usePrompt(message, when = true) {
const blocker = useBlocker(when);
useEffect(() => {
if (!blocker.state === 'blocked') return;
const confirmNavigation = window.confirm(message);
if (confirmNavigation) {
blocker.proceed();
} else {
blocker.reset();
}
}, [blocker, message]);
}
useBlocker отслеживает попытки навигации.window.confirm() выводит системное окно
подтверждения.proceed() и reset() управляют действием
навигации.import { useState } from 'react';
function FormPage() {
const [isDirty, setIsDirty] = useState(false);
usePrompt('Вы действительно хотите покинуть страницу? Несохраненные изменения будут потеряны.', isDirty);
return (
);
}
isDirty отслеживает, были ли внесены изменения.window.confirm блокирует пользовательский
поток, но стандартного способа кастомизации модального окна нет.useBlocker помечен как unstable и может меняться,
поэтому для долгосрочных проектов рекомендуется контролировать версии
библиотеки.beforeunload:useEffect(() => {
const handleBeforeUnload = (e) => {
if (isDirty) {
e.preventDefault();
e.returnValue = '';
}
};
window.addEventListener('beforeunload', handleBeforeUnload);
return () => window.removeEventListener('beforeunload', handleBeforeUnload);
}, [isDirty]);
usePrompt и beforeunload для
полной защиты от потери информации.isDirty корректно, чтобы не
блокировать навигацию без необходимости.