React Router реализует маршрутизацию на стороне клиента и позволяет
управлять навигацией в приложении без перезагрузки страницы. Центральным
элементом работы является компонент (ранее
в версиях до v6), который содержит набор
маршрутов и выбирает один из них для
отображения на основе текущего URL.
Для корректного отображения компонентов React Router применяет алгоритм ранжирования маршрутов, который определяет, какой маршрут считается совпадающим. Этот алгоритм учитывает точность соответствия пути, наличие динамических параметров и иерархию вложенности маршрутов.
Каждый маршрут имеет свой путь (path) и компонент
(element). React Router присваивает маршрутам
приоритет на основе точности
совпадения:
/about,
/contact) имеют самый высокий приоритет, так как они точно
соответствуют URL./users/:id)
имеют средний приоритет, так как могут совпадать с множеством конкретных
значений.*) или
wildcard-пути (/*) получают наименьший приоритет, так как
они соответствуют множеству адресов.import { Routes, Route } from "react-router-dom";
import Home from "./Home";
import UserProfile from "./UserProfile";
import NotFound from "./NotFound";
function App() {
return (
} />
} />
} />
);
}
В этом примере:
/ будет отображен только для точного совпадения главной
страницы./users/:id подхватит любые адреса вида
/users/1, /users/abc.*.React Router поддерживает вложенные маршруты, что позволяет строить сложные интерфейсы с общими макетами. При ранжировании учитывается глубина вложенности:
}>
} />
} />
При переходе на /dashboard/stats будет выбран именно
маршрут stats, а не родительский
/dashboard.
Параметры пути и wildcard имеют особое значение при определении совпадений.
:id) всегда считаются более специфичными,
чем *. } />
} />
/products/electronics/123 выберет
ProductDetail./products/electronics выберет
ProductList.React Router использует балльную систему при сравнении маршрутов, оценивая каждый путь по нескольким критериям:
Количество сегментов пути: чем больше сегментов,
тем выше приоритет. /users/:id/orders выше приоритета, чем
/users/:id.
Тип сегмента:
about, dashboard) →
+3 балла:id) → +2 балла*) → +1 баллНаличие точного совпадения (end или
exact) увеличивает приоритет.
Вложенность: чем глубже вложенность, тем выше ранжирование для совпадающего URL.
Для каждого маршрута:
Вычислить "балл совпадения" = сумма очков за сегменты
Статические +3, динамические +2, wildcard +1
Учитывать вложенность маршрута
Выбрать маршрут с наибольшим баллом совпадения
useParams для
извлечения значений.React Router использует компонент
и хук useNavigate для
управления навигацией без перезагрузки. Алгоритм ранжирования маршрутов
влияет на:
import { Link, useNavigate } from "react-router-dom";
function Navigation() {
const navigate = useNavigate();
return (
<>
Главная
Профиль пользователя
>
);
}