While working on a migration to React Router v6 recently, I hit a snag while trying to take advantage of the much-improved nested routes feature. This was in an application using MaterialUI, with a top-level layout component presenting MUI Tabs to the user.
The v5 way
Before the v6-style nested layouts, I was passing the tab route to a TabbedLayout component as a URL Parameter via dynamic segments
(see :selectedTab in App.tsx below). The TabbedLayout component
was in charge of rendering the layout, and choosing which tab content component to render. As you can see, it's convenient to provide the :selectedTab parameter to
TabbedLayout, as it needs to know which tab is currently selected so it can highlight the correct tab:
import { BrowserRouter, Route, Routes, Navigate } from "react-router-dom"; import { useState } from "react"; import TabbedLayout, { tabs } from "./TabbedLayout"; export default function App() { return ( <BrowserRouter initialEntries={["tab1"]}> <Routes> <Route index element={<Navigate to={"tab1"} replace />} /> <Route path="/:selectedTab" element={<TabbedLayout />} /> </Routes> </BrowserRouter> ); }
