React-router-dom как вернуться назад (не в истории)

У меня есть несколько вложенных маршрутов, и мне нужно, так сказать, вернуться на «уровень вверх».

Я использую 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 - или какой подход здесь будет приличным?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте использовать крючок useNavigate() из react-router-dom.

Как я вижу, это может удовлетворить ваши потребности, передав дельту в качестве аргумента функции навигации, или вы можете просто передать маршрут, который хотите пройти.

OP использует v5.3.1, useNavigate представлен в v6.

Inder 05.05.2022 16:35

Совсем пропустил это. Благодарю.

Johnny Alex 06.05.2022 09:34

Ты можешь использовать "." или «..» в компоненте «Ссылка», чтобы перейти на один или два уровня вверх.

<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>

Это интересно. Попробую это. Спасибо!

Rasmus Puls 09.05.2022 12:30
Ответ принят как подходящий

Объект 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);
}

Edit react-router-dom-how-to-navigate-back-not-in-history

Если вы хотите подняться на два уровня вверх, то есть с "/dashboard/1/sub-page/7" на "/dashboard/1", используйте .slice(0, -2), чтобы отрезать последние сегменты два.

У меня нет доступа к useLocation и useHistory, так как они не являются частью основной версии 5. Но идея разделения пути, удаления двух последних частей и его повторной реконструкции прекрасно работает. Спасибо за вдохновение

Rasmus Puls 09.05.2022 12:33

@RasmusPuls Они наверняка зацепят react-router-dom@5. См. v5 история использования и `v5 использованиеМестоположение. Используете ли вы функциональные компоненты React? Если вы используете компоненты на основе классов, я могу адаптировать свой ответ для вашего варианта использования.

Drew Reese 10.05.2022 09:03

О, я не знал. Я привык оборачивать свой компонент в withRouter(), а затем получать history и location из реквизита.

Rasmus Puls 10.05.2022 14:56

Другие вопросы по теме