У меня есть несколько вложенных маршрутов, и мне нужно, так сказать, вернуться на «уровень вверх».
Я использую react-router-dom v5.3.1
history.goBack() перенесет меня на последнюю посещенную страницу, как если бы я использовал кнопку «Назад» в браузере. Мне это не нужно.
Представьте, что моя история выглядит примерно так...:
[
dashboard/1/sub-page/7
dashboard/1/sub-page/13
dashboard/1/sub-page/9
dashboard/1/sub-page/1
]
URL моего браузера: localhost:8080&app.html#/dashboard/1/sub-page/7
Предоставляет ли react-router-dom безопасный способ перехода к: localhost:8080&app.html#/dashboard/1 - или какой подход здесь будет приличным?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте использовать крючок useNavigate() из react-router-dom.
Как я вижу, это может удовлетворить ваши потребности, передав дельту в качестве аргумента функции навигации, или вы можете просто передать маршрут, который хотите пройти.
Совсем пропустил это. Благодарю.
Ты можешь использовать "." или «..» в компоненте «Ссылка», чтобы перейти на один или два уровня вверх.
<Link to = ".">Go one level up</Link>
<Link to = "..">Go two levels up</Link>
Другой подход заключается в сопоставлении маршрутов с помощниками, чтобы вы могли повторно использовать их по всей кодовой базе:
// Routes helpers
const dashboardRoute = (id) => `/dashboard/${id}`;
const subPageRoute = (id, subId) => `/dashboard/${id}/sub-page/${subId}`;
// Routes mapping
<Switch>
<Route path = {dashboardRoute(":id")}>
<Dashboard />
</Route>
<Route path = {subPageRoute(":id", ":subId")}>
<SubPage/>
</Route>
</Switch>
// Route helper usage
<Link to = {dashboardRoute(id)} >Go to dashboard route</Link>
Это интересно. Попробую это. Спасибо!
Объект history может перемещаться только по специально определенным путям через строку пути с помощью .push/.replace или перемещаться вперед/назад через дельту с помощью .go.
Вы можете создать обработчик «goToParent», который считывает текущее совпадающее местоположение pathname, отсекает последний сегмент пути и выдает PUSH.
Пример:
import { useLocation, useHistory } from "react-router-dom";
...
const { pathname } = useLocation();
const history = useHistory();
const goUpLevel = () => {
const parent = pathname.split("/").slice(0, -1).join("/");
history.push(parent);
}
Если вы хотите подняться на два уровня вверх, то есть с "/dashboard/1/sub-page/7" на "/dashboard/1", используйте .slice(0, -2), чтобы отрезать последние сегменты два.
У меня нет доступа к useLocation и useHistory, так как они не являются частью основной версии 5. Но идея разделения пути, удаления двух последних частей и его повторной реконструкции прекрасно работает. Спасибо за вдохновение
@RasmusPuls Они наверняка зацепят react-router-dom@5. См. v5 история использования и `v5 использованиеМестоположение. Используете ли вы функциональные компоненты React? Если вы используете компоненты на основе классов, я могу адаптировать свой ответ для вашего варианта использования.
О, я не знал. Я привык оборачивать свой компонент в withRouter(), а затем получать history и location из реквизита.
OP использует v5.3.1, useNavigate представлен в v6.