首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >侧栏实现:[路由]不是<Route>组件。<Routes>的所有组件子组件都必须是<Route>

侧栏实现:[路由]不是<Route>组件。<Routes>的所有组件子组件都必须是<Route>
EN

Stack Overflow用户
提问于 2022-07-21 15:51:02
回答 2查看 101关注 0票数 1

我正在尝试实现一个SideBar,但将它排除在/login路由之外。

我的代码现在看起来一团糟,我不太清楚为什么我现在会收到这个错误。

这就是我现在想做的:

App.js:

代码语言:javascript
复制
<Router>
    <div className="App">
        <SideBar
            onCollapse={(inactive) => {
                console.log(inactive);
                setInactive(inactive);
            }}
        />
        <div className={`container ${inactive ? "inactive" : ""}`}>
            {menuItems.map((menu, index) => (
                <>
                    <Route key={menu.name} exact={menu.exact} path={menu.to}>
                        <h1>{menu.name}</h1>
                    </Route>
                    {menu.subMenus && menu.subMenus.length > 0
                        ? menu.subMenus.map((subMenu, i) => (
                            <Route key={subMenu.name} path={subMenu.to}>
                                <h1>{subMenu.name}</h1>
                            </Route>
                        ))
                        : null}
                </>
            ))}
            <Routes>
                <Route exact path="/login" element={<Login />} />
                <Route exact path='/' element={<ProtectedRoutes />}>
                    <Routes>
                        <Route exact path='/main' element={<Main />} />
                    </Routes>
                </Route>
            </Routes>
        </div>
    </div>
</Router>

menuItems:

代码语言:javascript
复制
export const menuItems = [
    {
        name: "Dashboard",
        exact: true,
        to: "/",
        iconClassName: "bi bi-speedometer2",
    },
    {
        name: "Content",
        exact: true,
        to: `/content`,
        iconClassName: "bi bi-speedometer2",
        subMenus: [
            { name: "Courses", to: "/content/courses" },
            { name: "Videos", to: "/content/videos" },
        ],
    },
    { name: "Design", to: `/design`, iconClassName: "bi bi-vector-pen" },
    {
        name: "Content 2",
        exact: true,
        to: `/content-2`,
        iconClassName: "bi bi-speedometer2",
        subMenus: [
            { name: "Courses", to: "/content-2/courses" },
            { name: "Videos", to: "/content-2/videos" },
        ],
    },
    { name: "Design 2", to: `/design-2`, iconClassName: "bi bi-vector-pen" },
    { name: "Design 3", to: `/design-3`, iconClassName: "bi bi-vector-pen" },
    { name: "Design 4", to: `/design-4`, iconClassName: "bi bi-vector-pen" },
];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-21 16:03:56

这一问题如下:

代码语言:javascript
复制
<Routes>
  <Route exact path="/login" element={<Login />} />
  <Route exact path='/' element={<ProtectedRoutes />}>
    <Routes> // <-- here!!
      <Route exact path='/main' element={<Main />} />
    </Routes>
  </Route>
</Routes>

如果您只是尝试嵌套路由,那么您不需要额外的Routes组件。只有在呈现呈现后代路由的组件时,才需要Routes组件。

删除Routes

代码语言:javascript
复制
<Routes>
  <Route path="/login" element={<Login />} />
  <Route element={<ProtectedRoutes />}>
    <Route path='/main' element={<Main />} />
  </Route>
</Routes>

如果您想要排除某些路由上的UI组件,那么创建另一个布局路由组件,就像您对ProtectedRoutes所做的那样。

示例:

代码语言:javascript
复制
import { Outlet } from 'react-router-dom';

const SideBarLayout = ({ inactive, setInactive }) => (
  <>
    <SideBar
      onCollapse={(inactive) => {
        console.log(inactive);
        setInactive(inactive);
      }}
    />
    <div className={`container ${inactive ? "inactive" : ""}`}>
      {menuItems.map((menu) => (
        <React.Fragment key={menu.name}>
          <Link to={menu.to}>
            <h1>{menu.name}</h1>
          </Link>
          {menu?.subMenus?.map((subMenu) => (
            <Link key={subMenu.name} to={subMenu.to}>
              <h1>{subMenu.name}</h1>
            </Link>
          ))}
        </React.Fragment>
      ))}
    </div>
    <Outlet />
  </>
);

..。

代码语言:javascript
复制
<Routes>
  <Route path="/login" element={<Login />} />
  ... other routes w/o SideBar ...

  <Route element={<SideBarLayout {...{ inactive, setInactive }} />}>
    ... other routes with SideBar ...

    <Route element={<ProtectedRoutes />}>
      <Route path='/main' element={<Main />} />
      ... other protected routes ...
    </Route>
  </Route>
</Routes>
票数 1
EN

Stack Overflow用户

发布于 2022-07-21 16:03:28

尝试在路由器标记之间包装,如下所示:

代码语言:javascript
复制
<Router>
         <Route exact path="/login" element={<Login />} />
                <Route exact path='/' element={<ProtectedRoutes />}>
                    <Routes>
                        <Route exact path='/main' element={<Main />} />
                    </Routes>
                </Route>
      </Router>
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73069232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档