Preparei um caso de teste simples no Github para minha pergunta:
No meu App.jsx existe o seguinte código:
<NavDrawer />
<BrowserRouter>
<Routes>
<Route path="page1" element={<Page1 />} />
<Route path="page2" element={<Page2 />} />
<Route path="page3" element={<Page3 />} />
<Route path="*" element={<Page4 />} />
</Routes>
</BrowserRouter>
E no NavDrawer.jsx tenho o código:
const drawerLinks = [
{ text: "Page 1", path: "/page1", icon: <CarCrash /> },
{ text: "Page 2", path: "/page2", icon: <Help /> },
{ text: "Page 3", path: "/page3", icon: <Directions /> },
{ text: "Page 4", path: "/page4", icon: <CarRepair /> },
];
function MyListItem({ text, path, icon }) {
return (
<ListItem disablePadding>
<ListItemButton>
<ListItemIcon>{icon}</ListItemIcon>
<Link to={path}>
<ListItemText primary={text} />
</Link>
</ListItemButton>
</ListItem>
);
}
export default function NavDrawer() {
return (
<Drawer>
<BrowserRouter>
<nav>
<List>
{drawerLinks.map((item, index) => (
<MyListItem key={index} icon={item.icon} text={item.text} />
))}
</List>
</nav>
</BrowserRouter>
</Drawer>
);
}
Infelizmente, nada acontece quando clico em um dos Link
s do Drawer
, a página exibida permanece igual Page4
e não há mensagens ou erros impressos no console.
O
NavDrawer
componente está renderizando seu próprioBrowserRouter
componente completamente separado daqueleBrowserRouter
que éApp
renderizado. Os links clicadosNavDrawer
são manipulados peloNavDrawer
roteador do e o outro roteador principal desconhece completamente quaisquer ações de navegação que foram efetuadas e manipuladas.Você precisa apenas de um roteador por aplicativo, geralmente no nível raiz do aplicativo ou próximo a ele.
Remova
BrowserRouter
eNavDrawer
aninheNavDrawer
sob o componente raizBrowserRouter
para que um único roteador lide com todas as ações de navegação.Recebi uma resposta amigável de ulvesked no Reddit -
Eu tenho que usar não dois, mas um único
BrowserRouter
no arquivo App.jsx superior.Além disso, senti falta de passar o
path
argumento paraLink
s no arquivoDrawer
.Agora o aplicativo funciona conforme esperado: