简体   繁体   English

react js中如何处理不同路由的组件

[英]How to handle components with different routes in react js

I have build an react app with 3pages Page1,Page2,Page3 and have Navbar and Sidebar component.我已经构建了一个包含 3pages Page1、Page2、Page3 的反应应用程序,并具有导航栏和侧边栏组件。 And using react-router v6 for rendering components.并使用 react-router v6 渲染组件。

I want the Navbar component on all of the pages and Sidebar on only page3, i am able to render navbar on all the pages but how i can show only sidebar on the page3?????我想要所有页面上的导航栏组件和仅第 3 页上的侧边栏,我能够在所有页面上呈现导航栏,但我如何才能在第 3 页上仅显示侧边栏??????

Remember not to use Sidebar component direct in the page3.切记不要在page3中直接使用Sidebar组件。

Here is code and picture:这是代码和图片:

import "./App.css";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import Page1 from "./pages/page1/Page1";
import Page2 from "./pages/page2/Page2";
import Page3 from "./pages/page3/Page3";
import Navbar from "./components/navbar/Navbar";
import Sidebar from "./components/sidebar/Sidebar";

function App() {
  return (
    <Router>
      <Navbar />
      <Routes>
        <Route path="/page1" element={<Page1 />} />
        <Route path="/page2" element={<Page2 />} />
        <Route path="/page3" element={<Page3 />} />
      </Routes>
    </Router>
  );
}

export default App;

在此处输入图像描述

To pass multiple components to one Route and show them in that path, you can put those components in an array and give this array to the element prop in <Route/> .要将多个组件传递给一个Route并在该路径中显示它们,您可以将这些组件放在一个数组中,并将该数组提供给<Route/>中的element prop。

import "./App.css";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import Page1 from "./pages/page1/Page1";
import Page2 from "./pages/page2/Page2";
import Page3 from "./pages/page3/Page3";
import Navbar from "./components/navbar/Navbar";
import Sidebar from "./components/sidebar/Sidebar";

function App() {
  return (
    <Router>
      <Navbar />
      <Routes>
        <Route path="/page1" element={<Page1 />} />
        <Route path="/page2" element={[<Page2/>,<Sidebar/>]} />
        <Route path="/page3" element={<Page3 />} />
      </Routes>
    </Router>
  );
}

export default App;

With this, in the /page2 URL, you can access both components and then you can layout them有了这个,在/page2 URL 中,您可以访问这两个组件,然后您可以布局它们

The element takes any valid JSX as a value.element将任何有效的 JSX 作为值。 In RRDv6 it's common to use wrapper components to render multiple components or provide additional logic/UI you want only on specific routes.在 RRDv6 中,通常使用包装器组件来呈现多个组件或提供仅在特定路由上需要的附加逻辑/UI。 In this case you can use a React Fragment to wrap the Sidebar and Page3 components.在这种情况下,您可以使用 React Fragment来包装SidebarPage3组件。

import "./App.css";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import Page1 from "./pages/page1/Page1";
import Page2 from "./pages/page2/Page2";
import Page3 from "./pages/page3/Page3";
import Navbar from "./components/navbar/Navbar";
import Sidebar from "./components/sidebar/Sidebar";

function App() {
  return (
    <Router>
      <Navbar />
      <Routes>
        <Route path="/page1" element={<Page1 />} />
        <Route path="/page2" element={<Page2 />} />
        <Route
          path="/page3"
          element={(
            <>
              <Sidebar />
              <Page3 />
            </>
          )}
        />
      </Routes>
    </Router>
  );
}

export default App;

A more common approach would be to abstract this into a layout wrapper component that can wrap any routed component and additionally render a sidebar.一种更常见的方法是将其抽象为一个布局包装器组件,该组件可以包装任何路由组件并另外呈现侧边栏。 This is helpful when you want to do the above in more than one place and you want to reduce code duplication ( ie make the code more DRY ).当您想在多个地方执行上述操作并且您想减少代码重复(即使代码更干燥)时,这很有帮助。 Nested Route components are rendered into an Outlet .嵌套的Route组件被渲染到一个Outlet中。

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

const SidebarLayout = () => (
  <>
    <Sidebar />
    <Outlet />
  </>
);

... ...

import "./App.css";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import Page1 from "./pages/page1/Page1";
import Page2 from "./pages/page2/Page2";
import Page3 from "./pages/page3/Page3";
import Navbar from "./components/navbar/Navbar";
import SidebarLayout from "./components/sidebar/SidebarLayout";

function App() {
  return (
    <Router>
      <Navbar />
      <Routes>
        <Route path="/page1" element={<Page1 />} />
        <Route path="/page2" element={<Page2 />} />
        <Route path="/page3" element={<SidebarLayout />}>
          <Route path="/page3" element={<Page3 />} />
        </Route>
      </Routes>
    </Router>
  );
}

export default App;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM