四时宝库

程序员的知识宝库

七爪源码:使用 React Router 进行模块化

嵌套路由的简要指南

有时,在构建多页面应用程序时,您可能对不同的页面有非常不同的功能,或者您可能希望为应用程序的不同部分创建不同的布局。这可以通过模块化来创建应用程序的不同部分来实现。


关于 React-Router

React-Router 是一个轻量级的 React 客户端和服务器端路由库。它允许您在 Web 应用程序中处理路由,根据 URL 显示不同的页面。 React Router 将匹配 URL 并加载该特定页面的组件。版本 6 将为给定的 URL 选择最具体的匹配项,因此您不必担心路由排序。


目标

使用 React Router 将应用程序分割成不同的部分。


先决条件

对于本教程,您的计算机上必须安装 Node ≥ 14.0.0 和 npm ≥ 5.6。您还需要对构建和使用可重用组件有一个大致的了解,并且您需要一个代码编辑器。我们还将使用 styled-components,这是一个允许您直接在 JS 文件中编写 CSS 的库。这消除了在不同文件之间来回移动以设置组件样式的需要。

让我们开始吧。


设置

我们将首先通过在您的终端或 cmd 上运行此命令来创建一个新的 React 应用程序:

npx create-react-app my-router-app

导航到您的应用程序,然后安装 react-router-dom 包和 styled-components 包。 命令末尾的 @6 表示您正在添加 react-router-dom 版本 6。

cd my-router-app
npm install react-router-dom@6 --save styled-components

您的 package.json 文件应类似于以下内容:

"dependencies": {
  "@testing-library/jest-dom": "^5.16.5",
  "@testing-library/react": "^13.3.0",
  "@testing-library/user-event": "^13.5.0",
  "react": "^18.2.0",
  "react-dom": "^18.2.0",
  "react-router-dom": "^6.3.0",
  "react-scripts": "5.0.1",
  "styled-components": "^5.3.5",
  "web-vitals": "^2.1.4"
},

设置完成后,您可以在应用程序的文件夹中运行命令 npm start 以启动。 现在,当您在 localhost 上打开端口 3000 时,您可以看到默认的 React 应用程序。


创建页面和组件

我们在本节中创建的所有内容在技术上都是一个组件,但其中一些组件将用作页面,而其他组件将作为页面的一部分呈现。

我们首先在 src 文件夹中创建一个 pages 目录。 这是我们所有页面的去向。 而且,在我们的 src 文件夹中,我们创建了一个 components 目录,我们将在其中放置构成我们页面的其他组件。

我们将构建一个 LoginPage、一个 HomePage、一个 CollectionsPage 和一个 FavouritesPage。 我们还将使用 styled-components 为我们的组件添加非常简单的样式。

//pages/LoginPage.js

import styled from "styled-components";

const StyledHeading= styled.h1`
    font-weight: 400
`

const LoginPage = () => {
    return (
        <StyledHeading> Login Page</StyledHeading>
    )
}

export default LoginPage;

LoginPage.js 组件


//pages/HomePage.js

import styled from "styled-components";

const StyledHeading= styled.h1`
    font-weight: 400
`;

const HomePage = () => {
    return (
        <StyledHeading>Home Page</StyledHeading>
    )
}

export default HomePage;

HomePage.js 组件


//pages/CollectionsPage.js

import styled from "styled-components";

const StyledHeading= styled.h1`
    font-weight: 400
`;

const CollectionsPage = () => {
    return (
        <StyledHeading> Collections Page</StyledHeading>
    )
}

export default CollectionsPage;

CollectionsPage.js 组件


//pages/FavouritesPage.js

import styled from "styled-components";

const StyledHeading= styled.h1`
    font-weight: 400
`;

const FavouritesPage = () => {
    return (
        <StyledHeading> Favourites Page</StyledHeading>
    )
}

export default FavouritesPage;

FavouritesPage.js 组件


接下来,我们创建 Footer 组件。

//components/Footer.js

import styled from "styled-components";

const StyledFooter = styled.footer`
    position: absolute;
    display: flex;
    justify-content: center;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: #cfd8dc;
    color: snow;
    font-weight: 500
`

const Footer = () => {
    return (
        <StyledFooter>
            <p>Footer 2022</p>
        </StyledFooter>
    )
}

export default Footer;

Footer.js 组件

我们将在下一步中创建 Navbar 组件。

利用嵌套路由分割您的应用程序

嵌套路由是 React Router 提供的最强大的功能之一。 根据反应路由器文档:

路由可以相互嵌套,它们的路径也会嵌套(子继承父)

在我们的例子中,我们将使用嵌套路由概念来有条件地渲染 Navbar 和 Footer 组件。

我们首先在 components 文件夹中创建一个新组件,我们将其命名为 MainLaoyout.js 。 在这个组件中,我们将导入所有具有相似布局的组件以及出现在多个组件上的组件。 Navbarand 页脚组件将在 HomePage、CollectionsPage 和 FavouritesPage 中呈现。

//components/MainLayout.js

import React from 'react';
import Navbar from "./Navbar";
import Footer from "./Footer";
import HomePage from "../pages/HomePage";
import FavouritesPage from "../pages/FavouritesPage";
import CollectionsPage from "../pages/CollectionsPage";
import {
    Routes,
    Route,
    
  } from "react-router-dom";

  const MainLayout = () => {
    return (
        <React.Fragment>
            <Navbar />  
            <Routes>
                <Route path='/' element={<HomePage />} />
                <Route path='/favourites' element={<FavouritesPage />} />
                <Route path='/collections' element={<CollectionsPage />} />
            </Routes>
            <Footer />
        </React.Fragment>
    )
  }

  export default MainLayout;

从上面可以看出,要在多个页面上呈现一个组件,您必须将该组件放置在包含所述组件的 Routes 标记之外。 Routes 标签是 Route 标签的父标签,其中每个 Route 标签将包含可以导航到的每个页面。 这样,导航栏和页脚组件将出现在 Routes 标记中描述的所有页面上。

接下来,我们创建导航栏组件。 该组件将包含指向我们应用程序中所有其他页面的链接。

//components/Navbar.js

import styled from "styled-components";
import { Link as RouterLink } from "react-router-dom";

const StyledDiv = styled.div`
    display: flex;
    background-color: #cfd8dc;
    ul {
        display: flex;
        list-style: none;
    }
    ul li {
        padding-left: 1rem;
        color: snow;
        font-weight: 500
    }
    
`

const Navbar = () => {
    return (
        <StyledDiv>
            <ul>
                <li><RouterLink to='/home' >Home</RouterLink></li>
                <li><RouterLink to='collections' >Collections</RouterLink></li>
                <li><RouterLink to='favourites' >Favourites</RouterLink></li>
                <li><RouterLink to='login' >Logout</RouterLink></li>
            </ul>
        </StyledDiv>
    )
}

export default Navbar;

最后,在我们的 App.js 组件中,我们将不同的部分放在一起以完成我们的应用程序。

//src/App.js

import MainLayout from './components/MainLayout';
import LoginPage from './pages/LoginPage'
import './App.css';
import {
  BrowserRouter as Router,
  Routes,
  Route
  
} from "react-router-dom";

const App = () => {
  return (
    <Router>
      <Routes>
        <Route path='/login' element={<LoginPage />} />
        <Route path='*' element={<MainLayout />} />
      </Routes>
    </Router>
  );
}

export default App;

在这最后一步结束时,您应该有一个带有导航栏和页脚的主页。 当您浏览页面时,您应该会看到导航和页脚是持久的,当您单击“注销”选项时,您将看到导航和页脚不再存在。


结论

在本文中,我们使用嵌套路由来创建模块化。 我们的应用程序只有两个区域,但您可以使用此概念创建更多区域。

最后,请注意 Routes 标签中的每个子组件都必须是一个 Route 组件。 这就是为什么在 MainLayout 组件中我们使用了 React.Fragment ,所以当我们从 App.js 组件渲染它时,它被一个 Route 标签包围。


我希望你觉得这篇文章有帮助!

关注七爪网,获取更多APP/小程序/网站源码资源!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接