我在 Github 上为我的问题准备了一个简单的测试用例:
在我的App.jsx中有以下代码:
<NavDrawer />
<BrowserRouter>
<Routes>
<Route path="page1" element={<Page1 />} />
<Route path="page2" element={<Page2 />} />
<Route path="page3" element={<Page3 />} />
<Route path="*" element={<Page4 />} />
</Routes>
</BrowserRouter>
在NavDrawer.jsx中我有代码:
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>
);
}
不幸的是,当我单击Link
中的其中一个 s时Drawer
,没有任何反应,显示的页面保持不变,Page4
并且控制台中没有打印任何消息或错误。
该
NavDrawer
组件正在渲染自己的组件,与渲染的BrowserRouter
组件完全分开。点击的链接由 的路由器处理,而另一个主路由器完全不知道任何已生效和处理的导航操作。BrowserRouter
App
NavDrawer
NavDrawer
每个应用程序只需要一台路由器,通常位于应用程序的根级别或附近。
BrowserRouter
从根组件中删除NavDrawer
并嵌套NavDrawer
在根组件下BrowserRouter
,以便单个路由器处理所有导航操作。我在 Reddit 上收到了 ulvesked 的友好回答-
BrowserRouter
我必须在顶部 App.jsx 文件中使用不是两个,而是一个。另外,我错过了将
path
参数传递Link
给Drawer
.现在应用程序按预期运行: