我正在迁移到react-router-dom V6.我在组件中嵌套了路由,在v5中,它工作得很好.但现在它不起作用了,因为它总是说没有与位置匹配的路由. 我想把ROUTE放在我的Layout组件中,然后当组件命中时,它将调用ROUTE INTERNAL.这不管用.我曾经在v5中使用SwitchBrowserRouter,一切都很好.我想不出哪里出了问题.

以下是我的代码:

App.js

import React from "react";
import RootRouters from "./components/routers/RootRouters";
import { BrowserRouter as Router } from "react-router-dom";
import "./App.css";

function App() {
    return (
        <Router>
            <div className="App">
                <RootRouters />
            </div>
        </Router>
    );
}

export default App;

RootRouters:

import React from "react";
import { Route, Routes } from "react-router-dom";
import Login from "../auth-page/login";
import Home from "../home/home";
import SignUp from "../auth-page/sign-up";
import AdminLogin from "../../pages/admin/Login";
import Layout from "../../components/admin/layout/Layout";

const RootRouters = () => {
    return (
        <Routes>
            <Route path="/home" element={<Home />} />
            <Route path="/login" element={<Login />} />
            {/* <Route path="/" element={<Home />} /> */}
            <Route path="/register" element={<SignUp />} />
            <Route path="/admin/login" element={<AdminLogin />} />
            <Route element={<Layout />} />
        </Routes>
    );
};

export default RootRouters;

布局:

import React, { useEffect } from "react";
import "./layout.css";
import Sidebar from "../sidebar/Sidebar";
import TopNav from "../topnav/TopNav";
import AdminRoutes from "../../routers/AdminRouters";
import { BrowserRouter, Route } from "react-router-dom";
import { useSelector, useDispatch } from "react-redux";
import ThemeAction from "../../../redux/actions/ThemeAction";

const Layout = () => {
    const themeReducer = useSelector((state) => state.ThemeReducer);

    const dispatch = useDispatch();

    useEffect(() => {
        const themeClass = localStorage.getItem("themeMode", "theme-mode-light");

        const colorClass = localStorage.getItem("colorMode", "theme-mode-light");

        dispatch(ThemeAction.setMode(themeClass));

        dispatch(ThemeAction.setColor(colorClass));
    }, [dispatch]);

    return (
        <Route
            render={(props) => (
                <div className={`layout ${themeReducer.mode} ${themeReducer.color}`}>
                    <Sidebar {...props} />
                    <div className="layout__content">
                        <TopNav />
                        <div className="layout__content-main">
                            <AdminRoutes />
                        </div>
                    </div>
                </div>
            )}
        />
    );
};

export default Layout;

管理路由:

import React from "react";
import { Route, Routes } from "react-router-dom";
import Dashboard from "../../pages/admin/Dashboard";
import Customers from "../../pages/admin/Customers";
import Products from "../../pages/admin/Products";
import NewDocument from "../../pages/admin/document/NewDocument";
import DetailDocument from "../../pages/admin/document/DetailDocument";
import EditDocument from "../../pages/admin/document/EditDocument";

const AdminRoutes = () => {
    return (
        <Route>
            <Route path="/admin/documents/new" component={NewDocument} />
            <Route path="/admin/documents/detail" component={DetailDocument} />
            <Route path="/admin/documents/update" component={EditDocument} />
            <Route path="/admin/customers" component={Customers} />
            <Route path="/admin/products" component={Products} />
            <Route path="/home" component={Dashboard} />
        </Route>
    );
};

export default AdminRoutes;

推荐答案

更新RootRouter以将Layout组件呈现在path="*"上,以便它可以参与路由匹配,例如它具有路径.

const RootRouters = () => {
  return (
    <Routes>
      <Route path="/home" element={<Home />} />
      <Route path="/login" element={<Login />} />
      {/* <Route path="/" element={<Home />} /> */}
      <Route path="/register" element={<SignUp />} />
      <Route path="/admin/login" element={<AdminLogin />} />
      <Route path="*" element={<Layout />} />
    </Routes>
  );
};

更新Layout直接渲染用户界面,Route组件不再有渲染功能props .

const Layout = () => {
  ...

  return (
    <div className={`layout ${themeReducer.mode} ${themeReducer.color}`}>
      <Sidebar />
      <div className="layout__content">
        <TopNav />
        <div className="layout__content-main">
          <AdminRoutes />
        </div>
      </div>
    </div>
  );
};

更新AdminRoutes以使用Reaction-RouterV6API/语法,即将Route组件呈现为Routes组件,并使用elementprops 和传递JSX.

const AdminRoutes = () => {
  return (
    <Routes>
      <Route path="/admin/documents/new" element={<NewDocument />} />
      <Route path="/admin/documents/detail" element={<DetailDocument />} />
      <Route path="/admin/documents/update" element={<EditDocument />} />
      <Route path="/admin/customers" element={<Customers />} />
      <Route path="/admin/products" element={<Products />} />
      <Route path="/home" element={<Dashboard />} />
    </Route>
  );
};

另一种建议

如果您更喜欢使用嵌套路由,您可以更新以下内容.

更新Layout组件以呈现Outlet组件而不是AdminRoutes组件.

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

const Layout = () => {
  ...

  return (
    <div className={`layout ${themeReducer.mode} ${themeReducer.color}`}>
      <Sidebar />
      <div className="layout__content">
        <TopNav />
        <div className="layout__content-main">
          <Outlet />
        </div>
      </div>
    </div>
  );
};

直接在RootRouters中呈现"管理路由".

const RootRouters = () => {
  return (
    <Routes>
      <Route path="/home" element={<Home />} />
      <Route path="/login" element={<Login />} />
      {/* <Route path="/" element={<Home />} /> */}
      <Route path="/register" element={<SignUp />} />
      <Route path="/admin">
        <Route path="login" element={<AdminLogin />} />
        <Route element={<Layout />}>
          <Route path="documents/new" element={<NewDocument />} />
          <Route path="documents/detail" element={<DetailDocument />} />
          <Route path="documents/update" element={<EditDocument />} />
          <Route path="customers" element={<Customers />} />
          <Route path="products" element={<Products />} />
          <Route index element={<Dashboard />} />
        </Route>
      </Route>
    </Routes>
  );
};

Javascript相关问答推荐

为什么新的Promises会在不需要的情况下被用来等待?

我可以在useState中调用函数并使用其数据吗

使用Astro和React的动态API

积分计算和 colored颜色 判断错误

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

通过在页面上滚动来移动滚动条

在带有背景图像和圆形的div中添加长方体阴影时的重影线

虚拟滚动实现使向下滚动可滚动到末尾

如何使onPaste事件与可拖动的HTML元素一起工作?

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

IF语句的计算结果与实际情况相反

基于props 类型的不同props ,根据来自接口的值扩展类型

在Reaction中的handleSubmit按钮内,useSelector值仍然为空

查询参数中的JAVASCRIPT/REACT中的括号

将数组扩展到对象中

OpenAI转录API错误请求

处理app.param()中的多个参数

JavaScript将字符串数字转换为整数

用Reaction-RT-Chart创建实时条形图

我为什么要使用回调而不是等待?