You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React-Router V6嵌套路由失效问题排查及解决建议

问题解决:React Router v6嵌套路由子组件不渲染

你的嵌套路由配置本身没问题,但父组件HomePage缺少了React Router v6用来渲染子路由内容的<Outlet />组件——这是嵌套路由生效的核心:父路由组件必须通过Outlet指定子路由组件的渲染位置。

具体修改步骤:

1. 在HomePage组件中导入Outlet

从react-router-dom导入Outlet:

import { Outlet } from 'react-router-dom';

2. 在HomePage的布局中添加Outlet

把Outlet放在抽屉旁的主区域,作为子路由内容的容器。修改后的HomePage代码示例:

import { Outlet, Link } from 'react-router-dom';
// 其他必要导入(Box、CssBaseline、Drawer等)

function HomePage() {
  // 保留你的open状态、handleDrawerClose等逻辑

  return (
    <Box sx={{ display: "flex" }}>
      <CssBaseline />
      {/* 抽屉组件 */}
      <Drawer variant="permanent" open={open}>
        <DrawerHeader>
          <IconButton onClick={handleDrawerClose}>
            {theme.direction === "rtl" ? (
              <ChevronRightIcon />
            ) : (
              <ChevronLeftIcon />
            )}
          </IconButton>
        </DrawerHeader>
        <Divider />
        <List> 
          {["Table", "Forms", "Send email", "Drafts"].map((text, index) => (
            <Link to={text.toLowerCase()} key={text}> {/* 将key移至Link标签,避免渲染警告 */}
              <ListItem disablePadding sx={{ display: "block" }}>
                <ListItemButton
                  sx={{
                    minHeight: 48,
                    justifyContent: open ? "initial" : "center",
                    px: 2.5,
                    color: "#9c1fb1", // 修正颜色值,添加#前缀
                  }}
                >
                  <ListItemIcon
                    sx={{
                      minWidth: 0,
                      mr: open ? 3 : "auto",
                      justifyContent: "center",
                    }}
                  >
                    {index % 2 === 0 ? <InboxIcon /> : <MailIcon />}
                  </ListItemIcon>
                  <ListItemText
                    primary={text}
                    sx={{ opacity: open ? 1 : 0, color: "#9c1fb1" }}
                  />
                </ListItemButton>
              </ListItem> 
            </Link>
          ))}
        </List>   
      </Drawer>

      {/* 子路由内容渲染容器:添加Outlet */}
      <Box component="main" sx={{ flexGrow: 1, p: 3 }}>
        <Outlet />
      </Box>
    </Box>
  );
}

export default HomePage;

额外优化点:

  • 将Link的key属性移至Link标签上,避免React列表渲染的key警告。
  • 修正颜色值:color: "9c1fb1"改为color: "#9c1fb1",否则颜色样式不会生效。

验证路由配置

你的App.js路由配置是正确的:

  • /homepage默认渲染HomePage,同时通过index路由默认显示Table组件。
  • /homepage/table和/homepage/forms会分别渲染对应组件,内容通过Outlet显示在HomePage的主区域。

完成以上修改后,访问/homepage/table和/homepage/forms时,子组件内容就会正常显示在抽屉旁的主区域了。

内容的提问来源于stack exchange,提问作者Prathamesh R. Pawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:20:16