'react-router-dom how to navigate back (not in history)

I have some nested routes, and I need to navigate back "a level up" so to say.

I'm using react-router-dom v5.3.1

history.goBack() will take me to last visited page, as if I use the back button in the browser. I don't need this.

Imagine my history looks something like this...:

[
  dashboard/1/sub-page/7
  dashboard/1/sub-page/13
  dashboard/1/sub-page/9
  dashboard/1/sub-page/1
]

My browser URL is: localhost:8080&app.html#/dashboard/1/sub-page/7

Does react-router-dom provide a safe way for navigating to: localhost:8080&app.html#/dashboard/1 - or what would be a decent approach here?



Solution 1:[1]

The history object can only navigate to specifically defined paths via a path string with .push/.replace, or navigate forward/backward via a delta with .go.

You can create a "goToParent" handler that reads the current matched location's pathname and slice off the last path segment and issue a PUSH.

Example:

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

If you wanted to go two levels up, i.e. from "/dashboard/1/sub-page/7" to "/dashboard/1" then use .slice(0, -2) to slice off the last two segments.

Solution 2:[2]

Try to use the useNavigate() hook from react-router-dom.

As I can see this might satisfy your need by passing a delta as an argument to the navigate function, or you can simply pass the route you want to go.

Solution 3:[3]

You can use "." or ".." in your Link component to go one or two levels up.

<Link to=".">Go one level up</Link>
<Link to="..">Go two levels up</Link>

Another approach is to map routes into helpers so you can reutilize them all along the codebase:

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Drew Reese
Solution 2 Johnny Alex
Solution 3 Nick Wood