我有一个全局文件,其中包含以下路径:

Global.tsx

import React from "react";
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import LoginPage from "../../pages/Authentication/Login";
import SignupPage from "../../pages/Authentication/Signup";

const Global = () => {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<LoginPage />} />
        <Route path="/signup" element={<SignupPage />}></Route>
      </Routes>
    </Router>
  );
};

export default Global;

以及另一个名为Admin的文件,该文件包含以下路由:

import React, { useContext, useEffect } from "react";
import "../../styles/App.scss";
import { ThemeContext } from "../../context/ThemeContext";
import { DARK_THEME, LIGHT_THEME } from "../../constants/themeConstants";
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'
import MoonIcon from '../../assets/icons/moon.svg';
import SunIcon from '../../assets/icons/sun.svg';
import BaseLayout from "../../layout/BaseLayout";
import DashboardScreen from "../../screens/Dashboard/DashboardScreen";
import PageNotFound from "../../screens/error/PageNotFound";

const Admin = () => {
  const { theme, toggleTheme } = useContext(ThemeContext);

  console.log(theme);

  useEffect(() => {
    if (theme === DARK_THEME) {
      document.body.classList.add("dark-mode");
    } else {
      document.body.classList.remove("dark-mode");
    }
  }, [theme]);

  return (
    <>
    <Router>
      <Routes>
        <Route element={<BaseLayout />}>
          <Route path="/admin" element={<DashboardScreen />}></Route>
          <Route path="*" element={<PageNotFound />}></Route>
        </Route>
      </Routes>
      <button
        type="button" 
        className="theme-toggle-btn"
        onClick={toggleTheme}
      >
        <img
          src={theme === LIGHT_THEME ? SunIcon: MoonIcon}
          alt=""
          className="theme-icon"
        />
      </button>
    </Router>
    </>
  );
};

export default Admin;

然后将它们合并到一个文件中:

// import "./App.scss";
import { SidebarProvider } from "./context/SidebarContext";
import { ThemeProvider } from "./context/ThemeContext";

import Admin from "./routes/admin/Admin";
import Global from "./routes/global/Global";

function App() {
  return (
    <div className="App">
      <Global />

      <ThemeProvider>
        <SidebarProvider>
          <Admin></Admin>
        </SidebarProvider>
      </ThemeProvider>
    </div>
  );
}

export default App;

发生的情况是,管理路由的侧栏显示了全局组件的登录或注册页面,尽管侧栏来自不同路由中的管理文件,如下图所示:

enter image description here

我try 了很多次,用不同的方法通过玩路由来分隔它们,但我做不到.必须有一种方法,使侧栏不会出现路由,尽管侧栏本身是一条不同的路由

推荐答案

这两个路由同时呈现,因此也同时呈现任何匹配的路由.

每个Reaction应用程序只需要一台路由.重构代码,使App呈现单个必要的Router组件,并在处理路由匹配的单个Routes组件下呈现所有路由.派生布线路径是相对于其父布线组件构建的.

示例:

Admin更新为布局布线组件,为其嵌套布线渲染Outlet.

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

const Admin = () => {
  const { theme, toggleTheme } = useContext(ThemeContext);

  console.log(theme);

  useEffect(() => {
    if (theme === DARK_THEME) {
      document.body.classList.add("dark-mode");
    } else {
      document.body.classList.remove("dark-mode");
    }
  }, [theme]);

  return (
    <>
      <Outlet />
      <button
        type="button" 
        className="theme-toggle-btn"
        onClick={toggleTheme}
      >
        <img
          src={theme === LIGHT_THEME ? SunIcon : MoonIcon}
          alt=""
          className="theme-icon"
        />
      </button>
    </>
  );
};
import { BrowserRouter, Routes, Route } from 'react-router-dom';

function App() {
  return (
    <div className="App">
      <BrowserRouter>
        <Routes>
          <Route path="/" element={<LoginPage />} />
          <Route path="/signup" element={<SignupPage />} />
          <Route
            element={(
              <ThemeProvider>
                <SidebarProvider>
                  <Admin />
                </SidebarProvider>
               </ThemeProvider>
            )}
          >
            <Route element={<BaseLayout />}>
              <Route path="/admin" element={<DashboardScreen />} />
              <Route path="*" element={<PageNotFound />} />
            </Route>
          </Route>
        </Routes>
      </BrowserRouter>
    </div>
  );
}

代码拆分

您将创建could个返回JSX的函数

示例:

import React from "react";
import { Route } from "react-router-dom";
import LoginPage from "../../pages/Authentication/Login";
import SignupPage from "../../pages/Authentication/Signup";

const globalRoutes = () => (
  <>
    <Route path="/" element={<LoginPage />} />
    <Route path="/signup" element={<SignupPage />} />
  </>
);

export default Global;
const adminRoutes = () => (
  <Route
    element={(
      <ThemeProvider>
        <SidebarProvider>
          <Admin />
        </SidebarProvider>
      </ThemeProvider>
    )}
  >
    <Route element={<BaseLayout />}>
      <Route path="/admin" element={<DashboardScreen />} />
      <Route path="*" element={<PageNotFound />} />
    </Route>
  </Route>
);
import { BrowserRouter, Routes, Route } from 'react-router-dom';

function App() {
  return (
    <div className="App">
      <BrowserRouter>
        <Routes>
          {globalRoutes()}
          {adminRoutes()}
        </Routes>
      </BrowserRouter>
    </div>
  );
}

更好的做法是直接呈现根级路由,其中每个被路由的组件呈现101路由(Routed components that render another 100 component and set of routes).基本上,每条路由都是一种"命名空间".

示例:

import React from "react";
import { Route, Routes } from "react-router-dom";
import LoginPage from "../../pages/Authentication/Login";
import SignupPage from "../../pages/Authentication/Signup";

const Global = () => {
  return (
    <Routes>
      <Route path="/" element={<LoginPage />} />
      <Route path="/signup" element={<SignupPage />} />
    </Routes>
  );
};

export default Global;
const Admin = () => {
  const { theme, toggleTheme } = useContext(ThemeContext);

  console.log(theme);

  useEffect(() => {
    if (theme === DARK_THEME) {
      document.body.classList.add("dark-mode");
    } else {
      document.body.classList.remove("dark-mode");
    }
  }, [theme]);

  return (
    <>
      <Routes>
        <Route element={<BaseLayout />}>
          <Route path="/" element={<DashboardScreen />} /> // <-- "/admin"
          <Route path="*" element={<PageNotFound />} />
        </Route>
      </Routes>
      <button
        type="button" 
        className="theme-toggle-btn"
        onClick={toggleTheme}
      >
        <img
          src={theme === LIGHT_THEME ? SunIcon: MoonIcon}
          alt=""
          className="theme-icon"
        />
      </button>
    </>
  );
};
import { BrowserRouter, Routes, Route } from 'react-router-dom';

function App() {
  return (
    <div className="App">
      <BrowserRouter>
        <Routes>
          <Route path="/*" element={<Global />} />
          <Route
            path="/admin/*"
            element={(
              <ThemeProvider>
                <SidebarProvider>
                  <Admin />
                </SidebarProvider>
              </ThemeProvider>
            )}
          />
        </Routes>
      </BrowserRouter>
    </div>
  );
}

Typescript相关问答推荐

带有微前端的动态React路由问题

为什么TypeScript失go 了类型推断,默认为any?''

扩展函数签名中的参数类型,而不使用泛型

如何正确地对类型脚本泛型进行限制

如何解决类型T不能用于索引类型{ A:typeof A; B:typeof B;. }'

为什么我的条件类型不能像我预期的那样工作?

如何将泛型对象作为返回类型添加到类型脚本中

从子类构造函数推断父类泛型类型

在类型脚本中创建泛型类型以动态追加属性后缀

为什么ESLint会抱怨函数调用返回的隐式`any`?

推断从其他类型派生的类型

重载函数的T helper参数

ANGLE订阅要么不更新价值,要么不识别价值变化

我可以使用typeof来强制执行某些字符串吗

ANGLE NumberValueAccessor表单控件值更改订阅两次

在REACT查询中获取未定义的isLoading态

Angular 16:无法覆盖;baseUrl;在tsconfig.app.json中

具有枚举泛型类型的 Typescript 对象数组

TS2532:对象可能未定义

如何编写一个接受 (string|number|null|undefined) 但只返回 string 且可能返回 null|undefined 的函数?