В последних версиях React Router (начиная с версии 6) произошло
важное изменение: компонент Switch был
заменён на Routes. Это изменение повлияло
на способ маршрутизации, определения путей и работы с вложенными
маршрутами.
Routes от SwitchПоддержка вложенных маршрутов
Routes позволяет создавать вложенные маршруты без
использования дополнительных вспомогательных компонентов. Каждый
дочерний автоматически рендерится
относительно родительского пути.
Явное указание element вместо
component В React Router v6 больше не используется
свойство component или render. Теперь для
рендеринга компонентов необходимо использовать свойство
element, в котором передается
JSX-компонент:
import { Routes, Route } from "react-router-dom";
import Home from "./Home";
import About from "./About";
function App() {
return (
} />
} />
);
}Нет необходимости в exact В версии
6 Route всегда работает как точное совпадение пути, поэтому
свойство exact больше не требуется. Путь / не
будет совпадать с /about, если указан явно.
Вложенные маршруты с Outlet Для
рендеринга дочерних маршрутов используется компонент
Outlet. Он служит местом для отображения
всех вложенных :
import { Routes, Route, Outlet } from "react-router-dom";
function Dashboard() {
return (
Dashboard
);
}
function Analytics() {
return Analytics
;
}
function App() {
return (
}>
} />
);
}
Здесь Analytics рендерится внутри Dashboard
на пути /dashboard/analytics.
Навигация с использованием
useNavigate Для программного перехода между
маршрутами теперь используется хук
useNavigate вместо устаревшего
history.push:
import { useNavigate } from "react-router-dom";
function LoginButton() {
const navigate = useNavigate();
function handleLogin() {
// выполнение логики авторизации
navigate("/dashboard");
}
return ;
}Поддержка wildcard и 404 страниц Для обработки
всех неопределённых маршрутов используется символ * в
пути:
function NotFound() {
return Страница не найдена
;
}
} />
} />
Маршруты с динамическими параметрами Параметры в
маршрутах определяются с помощью двоеточия : и доступны
через хук useParams:
import { useParams } from "react-router-dom";
function UserProfile() {
const { userId } = useParams();
return Профиль пользователя: {userId};
}
} />
Условные маршруты Условная отрисовка маршрутов
стала проще: можно использовать обычные JavaScript-выражения для
включения или исключения :
const isAdmin = true;
} />
{isAdmin && } />}
Switch должны быть вложены в
.component заменяется на element.exact больше не нужен..useNavigate вместо
history.push или useHistory.import { Routes, Route, Outlet, useNavigate, useParams } from "react-router-dom";
function App() {
return (
} />
}>
} />
} />
} />
} />
);
}
function Dashboard() {
return (
Dashboard
);
}
function UserProfile() {
const { id } = useParams();
return Профиль пользователя: {id};
}
function NotFound() {
return Страница не найдена
;
}
В этом примере показано одновременное использование вложенных
маршрутов, динамических параметров и обработки неизвестных путей. Новая
структура Routes делает код более читаемым и избавляет от
избыточного кода, присущего Switch.