我是react的新手,我想私下展示我的管理仪表板,但只显示第一条路由的工作,没有显示另一条路由的组件.这是我的代码:

<Routes>
      <Route path="/admin" element={<PrivateLayout />}>
        <Route path="/dashboard" exact element={<Dashboard />} />
      </Route>

      <Route exact path='/' element={<MainLayouts />}>
        <Route  path="/" element={<Course />} />
        <Route  path="/login" element={<Login />} />
        <Route  path="/register" element={<Register />} />
        <Route  path="/course/:id" element={<SingleCourse />} />
        <Route  path="/archive" element={<Archive />} />
        <Route  path="/logout" element={<Logout />} />
        <Route  path="*"  element={<NotFound />} />
      </Route>

    </Routes>

在"/dashboard"路径中显示PrivateLayout,在"/"路径中显示MainLayout,并登录、注册...不要走自己的路.

主要布局代码还有:

import React, { Fragment } from "react";
import Header from "./../common/headers";
import TopNav from "./../Navs/TopNav";
import MainNav from "./../Navs/MainNav";
import Footer from './../common/Footers';
import { useLocation } from 'react-router';

const MainLayouts = ({children}) => {
  
  const location = useLocation()
  
  return (
    <Fragment>
      <div className="landing-layer">
        <div className="container">
          <TopNav />
          {location.pathname === "/" ? <Header /> : null}
        </div>
      </div>

      <MainNav />

      <main id="home-page">
              <div className="container">{children}</div>
      </main>

      <Footer/>
 
    </Fragment>
  );
};

export default MainLayouts;

而私有布局代码是:

import React from "react";
import { useSelector } from "react-redux";
import { Link } from "react-router-dom";
import Helmet from "react-helmet";
import AdminTopNav from "../admin/AdminTopNav";
import AdminSidebar from "../admin/AdminSidebar";

const PrivateLayout = ({ children }) => {
    const user = useSelector((state) => state.user);
    return (
        <div id="wrapper">
            <Helmet>
                <title> dashboard </title>
            </Helmet>
            <nav
                className="navbar navbar-inverse navbar-fixed-top"
                role="navigation"
            >
                <div className="navbar-header">
                    <Link className="navbar-brand" to="/dashboard">
                        admin dashboard
                    </Link>
                </div>

                <AdminTopNav user={user} />

                <AdminSidebar />
            </nav>
            <div id="page-wrapper">{children}</div>
        </div>
    );
};

export default PrivateLayout;

推荐答案

Issue

问题在于,布局组件正在渲染要渲染到的嵌套Route组件的子属性,而不是Outlet组件.在从react-router-dom@5升级时,我还发现Outlet组件的使用令人困惑.

Outlet

应在父管线元素中使用<Outlet>来渲染其

Outlet个组件通常用于所谓的布局布线.

Layout Route

Solution

Outlet组件替换childrenprops 的渲染.

import { Outlet, useLocation } from 'react-router';

const MainLayouts = () => {
  const location = useLocation();
  
  return (
    <Fragment>
      <div className="landing-layer">
        <div className="container">
          <TopNav />
          {location.pathname === "/" ? <Header /> : null}
        </div>
      </div>

      <MainNav />

      <main id="home-page">
        <div className="container">
          <Outlet />
        </div>
      </main>

      <Footer/>
    </Fragment>
  );
};

export default MainLayouts;

...

import { Link, Outlet } from "react-router-dom";

const PrivateLayout = () => {
  const user = useSelector((state) => state.user);
  return (
    <div id="wrapper">
      <Helmet>
        <title> dashboard </title>
      </Helmet>
      <nav
        className="navbar navbar-inverse navbar-fixed-top"
        role="navigation"
      >
        <div className="navbar-header">
          <Link className="navbar-brand" to="/dashboard">
            admin dashboard
          </Link>
        </div>

        <AdminTopNav user={user} />

        <AdminSidebar />
      </nav>
      <div id="page-wrapper">
        <Outlet />
      </div>
    </div>
  );
};

export default PrivateLayout;

布局管线渲染Outlet组件后,您将看到为什么"/dashboard"不是"/admin"下的有效路径.

Error

路径"/admin"下嵌套的绝对路径"/dashboard"不是

我假设此时您希望所有"/admin"条路由都嵌套在它下面,所以使用绝对路径"/admin/dashboard"或相对路径"dashboard".

<Routes>
  <Route path="/admin" element={<PrivateLayout />}>
    <Route path="dashboard" element={<Dashboard />} />
  </Route>

  <Route path="/" element={<MainLayouts />}>
    <Route index element={<Course />} />
    <Route path="login" element={<Login />} />
    <Route path="register" element={<Register />} />
    <Route path="course/:id" element={<SingleCourse />} />
    <Route path="archive" element={<Archive />} />
    <Route path="logout" element={<Logout />} />
    <Route path="*" element={<NotFound />} />
  </Route>
</Routes>

Edit react-router-doesnt-work-in-my-private-admin-layout-and-normal-user-layout

Reactjs相关问答推荐

无法使用#13;或br将新行设置为文本区域'"&"<>

Redux向后端发送请求时出现钩子问题

在Next.js中实现动态更改的服务器组件

useTranslation不会在languageChanged上重新呈现组件

使用下一步中的路由/导航不会立即加载路由

在每页上应用字体-NextJS

React-router-dom的链接不改变路由(ReactRouter6)

useMemo 依赖项的行为

未处理的拒绝 (TypeError):无法读取未定义的属性(读取协议)

如何在 React 过滤器中包含价格过滤器逻辑?

Primereact 的日历组件在每个月 12 日之后使用非唯一键生成

将 clerk 与 supabase 集成的最佳实践

如何在同一路由路径上重新渲染组件(链接,V6)reactjs

无法在 reactJS 中使用空包装器 <>

我如何在所有组件中使用 Chakra UI toast?

React + i18next + Trans + Prettier:Prettier 最终会在重新格式化 JSX 时 destruct 翻译

React Router v6 - 访问嵌套路由和处理手写 url 的正确方法

模块解析失败:意外令牌 (257:106) 您可能需要适当的加载程序来处理此文件类型

如何根据数据库中的值设置单选按钮选中? - react

如何在按钮左下角制作 Material UI 菜单下拉菜单