Nested routes with react router v4 / v5 Nested routes with react router v4 / v5 javascript javascript

Nested routes with react router v4 / v5


In react-router-v4 you don't nest <Routes />. Instead, you put them inside another <Component />.


For instance

<Route path='/topics' component={Topics}>  <Route path='/topics/:topicId' component={Topic} /></Route>

should become

<Route path='/topics' component={Topics} />

with

const Topics = ({ match }) => (  <div>    <h2>Topics</h2>    <Link to={`${match.url}/exampleTopicId`}>      Example topic    </Link>    <Route path={`${match.path}/:topicId`} component={Topic}/>  </div>) 

Here is a basic example straight from the react-router documentation.


react-router v6

Update for 2021

The upcoming v6 will have nested Route components that Just Work™

See example code in this blog post

The question is about v4/v5, but when v6 ships the correct answer will be just use that if you can.


react-router v4 & v5

It's true that in order to nest Routes you need to place them in the child component of the Route.

However if you prefer a more inline syntax rather than breaking your Routes up across components, you can provide a functional component to the render prop of the Route you want to nest under.

<BrowserRouter>  <Route path="/" component={Frontpage} exact />  <Route path="/home" component={HomePage} />  <Route path="/about" component={AboutPage} />  <Route    path="/admin"    render={({ match: { url } }) => (      <>        <Route path={`${url}/`} component={Backend} exact />        <Route path={`${url}/home`} component={Dashboard} />        <Route path={`${url}/users`} component={UserPage} />      </>    )}  /></BrowserRouter>

If you're interested in why the render prop should be used, and not the component prop, it's because it stops the inline functional component from being remounted on every render. See the documentation for more detail.

Note that the example wraps the nested Routes in a Fragment. Prior to React 16, you can use a container <div> instead.


Just wanted to mention react-router v4 changed radically since this question was posted/answed.

There is no <Match> component any more! <Switch>is to make sure only the first match is rendered. <Redirect> well .. redirects to another route. Use or leave out exact to either in- or exclude a partial match.

See the docs. They are great. https://reacttraining.com/react-router/

Here's an example I hope is useable to answer your question.

<Router>  <div>    <Redirect exact from='/' to='/front'/>    <Route path="/" render={() => {      return (        <div>          <h2>Home menu</h2>          <Link to="/front">front</Link>          <Link to="/back">back</Link>        </div>      );    }} />              <Route path="/front" render={() => {      return (        <div>        <h2>front menu</h2>        <Link to="/front/help">help</Link>        <Link to="/front/about">about</Link>        </div>      );    }} />    <Route exact path="/front/help" render={() => {      return <h2>front help</h2>;    }} />    <Route exact path="/front/about" render={() => {      return <h2>front about</h2>;    }} />    <Route path="/back" render={() => {      return (        <div>        <h2>back menu</h2>        <Link to="/back/help">help</Link>        <Link to="/back/about">about</Link>        </div>      );    }} />    <Route exact path="/back/help" render={() => {      return <h2>back help</h2>;    }} />    <Route exact path="/back/about" render={() => {      return <h2>back about</h2>;    }} />  </div></Router>

Hope it helped, let me know. If this example is not answering your question well enough, tell me and I'll see if I can modify it.