javascript 如何在React Router DOM中将父组件路由到子组件

x33g5p2x  于 7个月前  发布在  Java
关注(0)|答案(1)|浏览(81)

我有一个管理 Jmeter 板,你可以check to hear
我想,如果管理员在用户点击(你可以在屏幕截图中看到),那么它将呈现用户页面和其他页面,我试图实现嵌套路由,但不工作,请如果有人可以帮助它将不胜感激
如果有人知道如何渲染子组件并在App.js中实现它们,请告诉我
Admin.js

import React from 'react'
import { useState } from "react";
import  "../AllStyle.css";
import {FaHouseUser, FaTasks, FaUser, FaBars} from "react-icons/fa"
import { NavLink } from 'react-router-dom'
import { AnimatePresence, motion } from "framer-motion";
import SidebarMenu from './SidebarMenu'

const routes = [
  {
  path: "/user",
  name: "Users",
  icon: <FaHouseUser />,
  },
  {
    path: "/project",
    name: "Project",
    icon: <FaTasks />,
    },
    {
      path: "/login",
      name: "Logout",
      icon: <FaUser />,
    },
];

const Admin = ({ children }) => {
  const [isOpen, setIsOpen] = useState(false);
  const toggle = () => setIsOpen(!isOpen);
  const showAnimation = {
    hidden: {
      width: 0,
      opacity: 0,
      transition: {
        duration: 0.5,
      },
    },
    show: {
      opacity: 1,
      width: "auto",
      transition: {
        duration: 0.5,
      },
    },
  };

  return (
    <>
      <div className="main-container">
        <motion.div
          animate={{
            width: isOpen ? "200px" : "45px",

            transition: {
              duration: 0.5,
              type: "spring",
              damping: 10,
            },
          }}
          className={`sidebar `}
        >
          <div className="top_section">
            <AnimatePresence>
              {isOpen && (
                <motion.h1
                  variants={showAnimation}
                  initial="hidden"
                  animate="show"
                  exit="hidden"
                  className="logo"
                >
                  Evalue portal
                </motion.h1>
              )}
            </AnimatePresence>

            <div className="bars">
              <FaBars onClick={toggle} />
            </div>
          </div>
          <section className="routes">
            {routes.map((route, index) => {
              if (route.subRoutes) {
                return (
                  <SidebarMenu
                    setIsOpen={setIsOpen}
                    route={route}
                    showAnimation={showAnimation}
                    isOpen={isOpen}
                  />
                );
              }

              return (
                <NavLink
                  to={route.path}
                  key={index}
                  className="link"
                  // activeClassName="active"
                >
                  <div className="icon">{route.icon}</div>
                  <AnimatePresence>
                    {isOpen && (
                      <motion.div
                        variants={showAnimation}
                        initial="hidden"
                        animate="show"
                        exit="hidden"
                        className="link_text"
                      >
                        {route.name}
                      </motion.div>
                    )}
                  </AnimatePresence>
                </NavLink>
              );
            })}
          </section>
        </motion.div>

        <main>{children}</main>
      </div>
    </>
  );
};

export default Admin

字符串
App.js

import {  BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from './components/Home';
import Navbar from './components/Navbar';
import Contact from './components/Contact';
import Service from './components/Service'
import Login from './components/Login';
// Redirect to their dashboar
import Admin from './components/dashboard/admin/Admin';
import Employee from './components/dashboard/Employee';
import Publisher from './components/dashboard/Publisher';
//Toast error message show
import { ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import Reset from './components/Reset';
import Newpassword from './components/Newpassword';

//admin Routes
import User from './components/dashboard/admin/pages/User'
import Project from './components/dashboard/admin/pages/Project'

function App() {

  return ( 
    <div>
  
      <Router>
    <Navbar/> 
    <Routes>
    
    <Route exact path="/" element={<Home/>} />
      <Route exact path="/service" element={<Service/>} />
      <Route exact path="/contact" element={<Contact/>} />
      <Route exact path="/login" element={<Login/>} />
      <Route exact path="/reset" element={<Reset/>} />
      <Route exact path="/reset/:token" element={<Newpassword/>} />
      {/* Redirect to their dashboard */}
      <Route exact path="/admin" element={<Admin/>} />
      <Route exact path="/employee" element={<Employee/>} />
      <Route exact path="/publisher" element={<Publisher/>} />
    </Routes>
    </Router>

    {/* admin routes*/}
      <Router>
        {/* <Admin>  For the admin children route to render children*/}
        <Routes>
        <Route  path="/user" element={<User />} />
        <Route  path="/project" element={<Project />} />
          </Routes>
          {/* </Admin> */}
      </Router>
    <ToastContainer
    position="top-right"
    autoClose={4000}
    hideProgressBar={false}
    newestOnTop={false}
    closeOnClick
    rtl={false}
    pauseOnFocusLoss
    draggable
    pauseOnHover
    />
    </div>
  );
}

export default App;

3mpgtkmj

3mpgtkmj1#

您可以使用Outlet组件。
实施示例:
index.js

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";
import App from "./App";
import { AuthProvider } from "./utils/context/auth";

ReactDOM.render(
  <React.StrictMode>
      <BrowserRouter>
        <AuthProvider>
          <App />
        </AuthProvider>
      </BrowserRouter>
  </React.StrictMode>,
  document.getElementById("root")
);

字符串
app.js

import React from "react";
import { Route, Routes } from "react-router-dom";
import { useAuth } from "./utils/context/auth";
import "react-toastify/dist/ReactToastify.css";
import "./index.css";
import LoginPage from "./app/pages/Auth/Login";
import NotFoundPage from "./app/pages/NotFound/NotFound";
import { ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';

const App = () => {
  const { checkingSession, isAuthenticated } = useAuth();

  if (checkingSession) {
    return <Loading />;
  }

  return (
    <>
      <Navbar />
      <Routes>
        {checkingSession || !isAuthenticated ? (
          <Route path={"/"} element={<LoginPage />} />
        ) : (
          <Route path="/admin" element={<Layout />}>
            <Route path={"/admin"} element={<Dashboard />} />
            <Route path={"/admin/project"} element={<Project />} />
          </Route>
        )}
        <Route path={"/*"} element={<NotFoundPage />} />
        <ToastContainer
          position="top-right"
          autoClose={4000}
          hideProgressBar={false}
          newestOnTop={false}
          closeOnClick
          rtl={false}
          pauseOnFocusLoss
          draggable
          pauseOnHover
      />
      </Routes>
    </>
  );
};

export default App;


layout.js

import React from 'react'
import { useState } from "react";
import  "../AllStyle.css";
import {FaHouseUser, FaTasks, FaUser, FaBars} from "react-icons/fa"
import { NavLink } from 'react-router-dom'
import { AnimatePresence, motion } from "framer-motion";
import SidebarMenu from './SidebarMenu'

import { Outlet } from "react-router-dom";
// The outlet component

const routes = [
  {
  path: "/user",
  name: "Users",
  icon: <FaHouseUser />,
  },
  {
    path: "/project",
    name: "Project",
    icon: <FaTasks />,
    },
    {
      path: "/login",
      name: "Logout",
      icon: <FaUser />,
    },
];

const Private = ({ children }) => {
  const [isOpen, setIsOpen] = useState(false);
  const toggle = () => setIsOpen(!isOpen);
  const showAnimation = {
    hidden: {
      width: 0,
      opacity: 0,
      transition: {
        duration: 0.5,
      },
    },
    show: {
      opacity: 1,
      width: "auto",
      transition: {
        duration: 0.5,
      },
    },
  };

  return (
    <>
      <div className="main-container">
        <motion.div
          animate={{
            width: isOpen ? "200px" : "45px",

            transition: {
              duration: 0.5,
              type: "spring",
              damping: 10,
            },
          }}
          className={`sidebar `}
        >
          <div className="top_section">
            <AnimatePresence>
              {isOpen && (
                <motion.h1
                  variants={showAnimation}
                  initial="hidden"
                  animate="show"
                  exit="hidden"
                  className="logo"
                >
                  Evalue portal
                </motion.h1>
              )}
            </AnimatePresence>

            <div className="bars">
              <FaBars onClick={toggle} />
            </div>
          </div>
          <section className="routes">
            {routes.map((route, index) => {
              if (route.subRoutes) {
                return (
                  <SidebarMenu
                    setIsOpen={setIsOpen}
                    route={route}
                    showAnimation={showAnimation}
                    isOpen={isOpen}
                  />
                );
              }

              return (
                <NavLink
                  to={route.path}
                  key={index}
                  className="link"
                  // activeClassName="active"
                >
                  <div className="icon">{route.icon}</div>
                  <AnimatePresence>
                    {isOpen && (
                      <motion.div
                        variants={showAnimation}
                        initial="hidden"
                        animate="show"
                        exit="hidden"
                        className="link_text"
                      >
                        {route.name}
                      </motion.div>
                    )}
                  </AnimatePresence>
                </NavLink>
              );
            })}
          </section>
        </motion.div>

        <main>
          <Outlet /> // The outlet component
        </main>
      </div>
    </>
  );
};

export default Private


基本上,Outlet会呈现你放在/admin路由中的路由。更多信息请参见此链接

相关问题