React Router使用方法

目录

  • 简介
  • React Router的三种使用模式
    • 声明模式
    • 数据模式
    • 框架模式
  • React Router7声明模式使用方法
    • 在入口文件引入BrowserRouter
    • 配置一个路由组件管理路由
    • 将路由组件引入App.tsx
    • 嵌套路由
    • 链接式路由导航 \ 和 \<Link>
    • 编程式路由导航

简介

React Router 是 React 的多策略路由器。在React应用中最新的React Router7有三种使用模式,分别是声明模式、数据模式、框架模式。从声明式模式转变为数据模式再转变为框架模式会增加更多功能,但代价是架构控制。使用模式取决于我们使用的顶级路由器 API。

React Router的三种使用模式

声明模式

声明模式启用了基本的路由功能,如将URL与组件匹配、在应用程序中导航,以及通过、useNavigate和useLocation等API提供活动状态。

import { BrowserRouter } from "react-router";ReactDOM.createRoot(root).render(<BrowserRouter><App /></BrowserRouter>
);

数据模式

通过将路由配置移动到React渲染之外,数据模式使用loader、action和useFetcher等API添加了数据加载、操作、挂起状态等。数据模式将路由配置用hooks创建一个router实例,类似于Vue中的vue-router的使用方法,如果对Vue很熟悉,可以使用数据模式。

import {createBrowserRouter,RouterProvider,
} from "react-router";let router = createBrowserRouter([{path: "/",Component: Root,loader: loadRootData,},
]);ReactDOM.createRoot(root).render(<RouterProvider router={router} />
);

框架模式

框架模式将数据模式与Vite插件包装在一起,通过以下方式添加完整的React Router体验:

  • 类型安全href
  • 类型安全路由模块API
  • 智能代码分割
  • SPA、SSR和静态渲染策略
import { index, route } from "@react-router/dev/routes";export default [index("./home.tsx"),route("about", "./about.tsx"),
];

具体的使用模式选择和三种模式的API参考:React Router7选择使用模式

React Router7声明模式使用方法

我的 React 项目采用 Vite + TypeScript构建(使用JavaScript也不影响观看),声明模式的路由已经足够使用了,所以我采用声明式路由,这也是React Router的经典使用方法,数据模式使用方法是在v6.4版本之后引入的,类似vue-router的使用方式。

在入口文件引入BrowserRouter

BrowserRouter 是一个用于管理路由的组件,它的作用如下:

  • 监听浏览器地址栏的变化,并根据路由配置渲染对应的组件。
  • 允许用户通过浏览器的前进、后退按钮或代码中的导航操作改变 URL,并同步更新视图。
  • 使用干净的URL,不像 HashRouter 那样带 # 号( BrowserRouter和HashRouter的区别)。
// src/main.tsx
import { createRoot } from 'react-dom/client'
import App from './App.tsx'
import { BrowserRouter } from "react-router";createRoot(document.getElementById('root')!).render(<BrowserRouter><App /></BrowserRouter>
)

配置一个路由组件管理路由

在src目录下,我们新建一个文件夹routes,然后创建文件index.tsx,我们将所有的路由规则都写在这个组件中。

// /src/routes/index.tsx
import React from 'react';
import Layout from '@/views/Layout/index'
import Login from '@/views/Login/index'
import { Route, Routes } from 'react-router';
import Album from '@/views/Album';
import AddAlbum from '@/views/Album/AddAlbum';
import Photo from '@/views/Photo';
import Video from '@/views/Video';
import Home from '@/views/Home';
import AlbumList from '@/views/Album/AlbumList';
import DelAlbum from '@/views/Album/DelAlbum';
import EditAlbum from '@/views/Album/EditAlbum';const APP: React.FC = () => {return (<div><Routes><Route path='/' element={<Layout />}><Route index element={<Home />} />{/* 嵌套路由 */}<Route path='album' element={<Album />}><Route index element={<AlbumList />}></Route><Route path='addAlbum' element={<AddAlbum />}></Route><Route path='delAlbum' element={<DelAlbum />}></Route><Route path='editAlbum' element={<EditAlbum />}></Route></Route><Route path='photo' element={<Photo />} /><Route path='video' element={<Video />} /></Route><Route path='/login' element={<Login />} /></Routes></div>);
}
export default APP

Route 组件用于 定义 URL 路径,并指定在该路径下需要渲染的组件。Routes 是一个用于定义路由的组件,它管理多个 Route 组件,并根据当前 URL 渲染匹配的组件。@是使用了路径别名,可以直接从src目录开始寻找文件(vite+react项目配置项目路径别名)

将路由组件引入App.tsx

// /src/App.tsx
import React from 'react';
import Routes from '@/routes/index';const App: React.FC = () => {return (<><Routes></Routes></>);
}
export default App

在App.tsx中引入路由组件后,创建对应的路由组件后就可以进行路由跳转了。

嵌套路由

我们在routes/index.tsx中使用了嵌套路由,嵌套路由中子路由的path属性不需要加 “/” 。

<Route path='album' element={<Album />}><Route index element={<AlbumList />}></Route><Route path='addAlbum' element={<AddAlbum />}></Route><Route path='delAlbum' element={<DelAlbum />}></Route><Route path='editAlbum' element={<EditAlbum />}></Route>
</Route>

对于这个嵌套路由,在父路由上我们需要加 Outlet 组件给子路由占位,代表子路由页面渲染的位置。在第一个子路由身上有index属性,代表默认显示的子路由页面。

// src/views/Album/index.tsx
import React from 'react';
import { Outlet } from 'react-router';const Album: React.FC = () => {return (<Outlet/>);
}
export default Album;

对于其他子路由页面,我们可以简单设置一下,可以显示效果就行。

// src/views/Album/AlbumList.tsx
const AlbumList: React.FC = () => {return (<><h1>相册列表</h1></>)
}export default EditAlbum;

链接式路由导航 <NavLink/> 和 <Link>

<NavLink/> 或 <Link> 可以生成一个路由链接,通过点击链接来进行路由跳转。 <NavLink/>该组件适用于那些需要渲染激活状态的导航链接。当 <NavLink> 处于激活状态时,它会自动拥有一个 .active 类名,以便于使用 CSS 轻松设置样式。不需要激活样式时,可以使用 <Link> 组件。

<NavLink to="/album" style={({ isActive }) => ({color: isActive ? "red" : "black",})}>相册
</NavLink><Link to="/album">相册</Link>

编程式路由导航

使用useNavigate这个钩子(hook)允许程序在无需用户交互的情况下将用户导航至新页面。使用场景如下:

  • 表单提交完成之后
  • 用户长时间没有操作退出系统
  • 有时间限制的游戏界面等等场景
import { useEffect } from "react";
import { useNavigate } from "react-router";const AddAlbum: React.FC = () => {const navigate = useNavigate();useEffect(() => {// 设置一个定时器,用于延迟 3 秒后进行页面跳转const timer = setTimeout(() => {navigate('/album/delAlbum');}, 3000)return () => {// 当组件卸载时,清除定时器。clearTimeout(timer)}}, [navigate])return (<div><h1>这是新建相册页面,3秒后跳转到删除相册界面</h1></div>)
}export default AddAlbum;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39495.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Four.meme是什么,一篇文章读懂

一、什么是Four.meme&#xff1f; Four.meme 是一个运行在 BNB 链的去中心化平台旨在为 meme 代币供公平启动服务。它允许用户以极低的成本创建和推出 meme 代币&#xff0c;无需预售或团队分配&#xff0c;它消除了传统的预售、种子轮和团队分配&#xff0c;确保所有参与者有…

解决PHP内存溢出问题的讨论和分析

PHP作为一种广泛使用的服务器端脚本语言&#xff0c;在处理大量数据或复杂任务时&#xff0c;常常会遇到内存溢出的问题。内存溢出不仅会导致程序崩溃&#xff0c;还可能影响服务器的稳定性。本文将探讨解决PHP内存溢出问题的最佳实践&#xff0c;并通过代码示例进行详细说明。…

git,openpnp - 根据安装程序打包名称找到对应的源码版本

文章目录 git,openpnp - 根据安装程序打包名称找到对应的源码版本概述笔记备注 - 提交时间不可以作为查找提交记录的依据END git,openpnp - 根据安装程序打包名称找到对应的源码版本 概述 想在openpnp官方最新稳定版上改一改&#xff0c;首先就得知道官方打包的安装程序对应的…

基于Spring Boot的停车场管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

基于Spring Boot + Vue的银行管理系统设计与实现

基于Spring Boot Vue的银行管理系统设计与实现 一、引言 随着金融数字化进程加速&#xff0c;传统银行业务向线上化转型成为必然趋势。本文设计并实现了一套基于Spring Boot Vue的银行管理系统&#xff0c;通过模块化架构满足用户、银行职员、管理员三类角色的核心业务需求…

Unity | Tag、Layer常量类生成工具

在项目开发中我们可以对诸如Layer、Tag等编辑器数据进行常量生成&#xff0c;来代替在代码中通过输入字符串生成常量的形式以提高开发效率。 Layer的生成可以通过LayerMask.LayerToName获取层名称&#xff08;也可以从TagManager.asset中获得 &#xff09;&#xff0c;Tag的生成…

两个手机都用流量,IP地址会一样吗?深入解析

在日常生活中&#xff0c;我们常常会同时使用多台手机设备上网&#xff0c;尤其是在流量充足的情况下。你是否曾好奇过&#xff0c;当两台手机同时使用流量上网时&#xff0c;它们的IP地址会是一样的吗&#xff1f;这个问题看似简单&#xff0c;却涉及移动网络的技术原理。本文…

后端——AOP异步日志

需求分析 在SpringBoot系统中&#xff0c;一般会对访问系统的请求做日志记录的需求&#xff0c;确保系统的安全维护以及查看接口的调用情况&#xff0c;可以使用AOP对controller层的接口进行增强&#xff0c;作日志记录。日志保存在数据库当中&#xff0c;为了避免影响接口的响…

Qt的内存管理机制

在Qt中&#xff0c;显式使用new创建的对象通常不需要显式调用delete来释放内存&#xff0c;这是因为Qt提供了一种基于对象树(Object Tree)和父子关系(Parent-Child Relationship)的内存管理机制。这种机制可以自动管理对象的生命周期&#xff0c;确保在适当的时候释放内存&…

React:React主流组件库对比

1、Material-UI | 官网 | GitHub | GitHub Star: 94.8k Material-UI 是一个实现了 Google Material Design 规范的 React 组件库。 Material UI 包含了大量预构建的 Material Design 组件&#xff0c;覆盖导航、滑块、下拉菜单等各种常用组件&#xff0c;并都提供了高度的可定制…

排序算法(插入,希尔,选择,冒泡,堆,快排,归并)

1.插入排序 插入排序的主要思想是额外申请一个空间cur&#xff0c;让cur一开始等于数组的第1号位置,设置i1&#xff0c;让i-1的元素与其比较&#xff0c;如果arr[i-1]>arr[i]&#xff0c;就让arr[i1] arr[i]&#xff0c;当进行到最后一次对比结束&#xff0c;i-1,再让arr[…

python学习笔记--实现简单的爬虫(二)

任务&#xff1a;爬取B站上最爱欢迎的编程课程 网址&#xff1a;编程-哔哩哔哩_bilibili 打开网页的代码模块&#xff0c;如下图&#xff1a; 标题均位于class_"bili-video-card__info--tit"的h3标签中&#xff0c;下面通过代码来实现&#xff0c;需要说明的是URL中…

Vue3 实现pdf预览

1.使用到的插件 vue3-pdf-app 以及预览效果 2.下载依赖 // 可以使用npm 以及pnpm // 下载版本1.0.3 pnpm install vue3-pdf-app^1.0.3 3.封装pdfModel组件复用 <template><VuePdfApp :page-scale"pageScale" :theme"theme" :style"width: …

SpringBoot集成Elasticsearch 7.x spring-boot-starter-data-elasticsearch 方式

SpringBoot集成Elasticsearch 7.x | spring-boot-starter-data-elasticsearch 方式 前言添加maven依赖配置application.properties测试实体类 方式一&#xff1a;继承 ElasticsearchRepository&#xff08;适合简单查询&#xff09; 直接使用想自定义自己的Repository接口 方式…

【Clang AST】基于 Clang 获取分析 AST

The Clang AST AST&#xff08;Abstract Syntax Tree&#xff09;抽象语法树 AST是什么 抽象语法树&#xff08;Abstract Syntax Tree, AST&#xff09;是源代码的抽象表示&#xff0c;广泛用于编译器和分析工具中。 AST将源代码的语法结构转换为树形结构&#xff0c;其中每…

onedav一为导航批量自动化导入网址(完整教程)

OneNav作为一个功能强大的导航工具,支持后台管理、加密链接、浏览器书签批量导入等功能,能够帮助用户轻松打造专属的导航页面。今天,我将为大家详细介绍如何实现OneNav导航站的批量自动化导入网址。 1、建立要批量导入的表格 格局需要创建表格,表格的要求是一定要有需要,…

文档处理控件Aspose.Words 教程:.NET版中增强的 AI 文档摘要功能

Aspose.Words是一个功能强大的 Word 文档处理库。它可以帮助开发人员自动编辑、转换和处理文档。 自 24.11 版以来&#xff0c;Aspose.Words for .NET 提供了 AI 驱动的文档摘要功能&#xff0c;使用户能够从冗长的文本中快速提取关键见解。在 25.2 版中&#xff0c;我们通过使…

AI本地部署之dify

快捷目录 Windows 系统一、环境准备:首先windows 需要准备docker 环1. 安装Docker desktop2. 安装Docker3. 配置Docker 镜像路径4. 配置Docker 下载镜像源5. 重启Docker服务二、Dify 下载和安装1. Dify下载2. Dify 配置3. Dify 安装附件知识:4. Dify创建账号三、下载Ollama d…

DDS协议(二)

一、DDS发布订阅机制 基于发布/订阅的数据分发服务为各种虚拟机载设备之间的通信提供了统一的底层支撑 其技术原理如图所示&#xff1a; 发布方应用程序和订阅方应用程序分别同发布/订阅中间件通信&#xff0c; 而数据的实际分发是由发布/订阅中间件来处理。 发布方将包含主题…

GitHub供应链攻击事件:Coinbase遭袭,218个仓库暴露,CI/CD密钥泄露

此次供应链攻击涉及GitHub Action "tj-actions/changed-files"&#xff0c;最初是针对Coinbase的一个开源项目的高度定向攻击&#xff0c;随后演变为范围更广的威胁。 攻击过程与影响 Palo Alto Networks Unit 42在一份报告中指出&#xff1a;“攻击载荷主要针对其…