React Router使用方法

embedded/2025/3/29 6:25:58/

目录

  • 简介
  • 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.ppmy.cn/embedded/176873.html

相关文章

架构设计之自定义延迟双删缓存注解(下)

架构设计之自定义延迟双删缓存注解(下) 小薛博客官方架构设计之自定义延迟双删缓存注解(下)地址 为了保证Cache和ClearAndReloadCache的灵活性&#xff0c;特意加入EL表达式解析 1、Cache package com.xx.cache;import java.lang.annotation.*; import java.util.concurren…

IPv4向IPv6过渡

主要有三种过渡技术 隧道技术&#xff1a;用于解决IPv6节点之间通过IPv4网络进行通信的问题协议翻译技术&#xff1a;使纯ipv6节点与纯Ipv4节点之间进行通信双协议栈技术&#xff1a;使ipv4与ipv6可以共存于同一台设备和同一个网络中 隧道技术 把ipv6分组封装到Ipv4分组中&a…

JSONP 漏洞

JSONP 漏洞介绍 JSONP (JSON with Padding) 是一种用于跨域数据请求的技术&#xff0c;通常用于绕过浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;。它通过动态创建 <script> 标签来加载外部资源&#xff0c;并利用回调函数处理返回的数据。 漏洞原理 …

用 Pinia 点燃 Vue 3 应用:状态管理革新之旅

用 Pinia 点燃 Vue 3 应用&#xff1a;状态管理革新之旅 用 Pinia 点燃 Vue 3 应用&#xff1a;状态管理革新之旅什么是 Pinia&#xff1f;安装与基础配置创建和使用 Store定义 Store在组件中使用 Store 高级用法组合多个 Store持久化状态 总结 用 Pinia 点燃 Vue 3 应用&#…

Copilot提示词库用法:调整自己想要的,记住常用的,分享该共用的

不论你是 Microsoft 365 Copilot 的新用户还是熟练运用的老鸟&#xff0c;不论你是使用copilot chat&#xff0c;还是在office365中使用copilot&#xff0c;copilot提示词库都将帮助你充分使用copilot这一划时代的产品。它不仅可以帮助你记住日常工作中常用的prompt提示词&…

windows清除电脑开机密码,可保留原本的系统和资料,不重装系统

前言 很久的一台电脑没有使用了&#xff0c;开机密码忘了&#xff0c;进不去系统 方法 1.将一个闲置u盘设置成pe盘&#xff08;注意&#xff0c;这个操作会清空原来u盘的数据&#xff0c;需要在配置前将重要数据转移走&#xff0c;数据无价&#xff0c;别因为配置这个丢了重…

辉视智慧月子中心:爱与科技共筑母婴温馨港湾

在辉视智慧月子中心&#xff0c;每一刻都洋溢着爱与科技的和谐共鸣。这里不仅是一个提供产后护理服务的场所&#xff0c;更是科技与人文深度融合的典范&#xff0c;致力于为每一位新妈妈与宝宝打造一段无与伦比的智能康复之旅。今天&#xff0c;我们将深入探讨辉视智慧月子中心…

《水上安全》杂志社水上安全编辑部水上安全杂志2025年第3期目录

智慧交通新业态 水利工程施工与维修养护中的安全管理策略 孙维全; 1-3 溯源排查在水环境治理中的作用研究——以深圳市宝安区西乡河流域为例 苏善昭;朱贵兵; 4-6 试论街道低洼易涝区域防汛对策 刘辉; 7-9 水利工程管理现状及改进对策 崔建华; 10-12 水生植…