当前位置: 首页 > article >正文

React 第五十节 Router 中useNavigationType的使用详细介绍

前言

useNavigationType 是 React Router v6 提供的一个钩子,用于确定用户如何导航到当前页面。
它提供了关于导航类型的洞察,有助于优化用户体验和实现特定导航行为。

一、useNavigationType 核心用途

1.1、检测导航方式:

判断用户是通过浏览器动作(前进/后退)还是程序化导航到达当前页面

1.2、优化页面行为:

根据导航类型调整页面效果(如过渡动画

1.3、用户行为分析:

跟踪用户如何与你的应用交互

1.4、恢复滚动位置:

只在需要时恢复滚动位置

二、useNavigationType导航类型值

POP:通过浏览器的前进/后退按钮或历史记录跳转

PUSH:通过程序化导航(如 navigate())添加新条目到历史堆栈

REPLACE:通过程序化导航替换当前历史条目

三、useNavigationType使用说明

3.1、基本用法

import { useNavigationType } from 'react-router-dom';function MyComponent() {const navType = useNavigationType();return (<div><p>导航类型: {navType}</p></div>);
}

3.2、完整示例:根据导航类型应用不同动画

import React, { useEffect, useState } from 'react';
import { useNavigationType,useLocation,Routes,Route,Link,useNavigate
} from 'react-router-dom';// 主应用组件
export default function App() {return (<div className="app"><header><h1>useNavigationType 示例</h1><nav><Link to="/" className="nav-link">首页</Link><Link to="/about" className="nav-link">关于</Link><Link to="/contact" className="nav-link">联系我们</Link></nav></header><main><Routes><Route path="/" element={<HomePage />} /><Route path="/about" element={<AboutPage />} /><Route path="/contact" element={<ContactPage />} /></Routes></main><footer><p>尝试使用浏览器前进/后退按钮查看不同效果</p></footer></div>);
}// 页面组件 - 带导航类型检测
function PageTemplate({ title, children }) {const navType = useNavigationType();const [animation, setAnimation] = useState('');useEffect(() => {// 根据导航类型应用不同动画switch(navType) {case 'POP':setAnimation('slide-in-left');break;case 'PUSH':setAnimation('slide-in-right');break;case 'REPLACE':setAnimation('fade-in');break;default:setAnimation('fade-in');}// 动画结束后重置状态const timer = setTimeout(() => setAnimation(''), 500);return () => clearTimeout(timer);}, [navType]);return (<div className={`page ${animation}`}><div className="navigation-indicator"><span className={`indicator ${navType === 'POP' ? 'active' : ''}`}>浏览器导航</span><span className={`indicator ${navType === 'PUSH' ? 'active' : ''}`}>应用内导航</span><span className={`indicator ${navType === 'REPLACE' ? 'active' : ''}`}>替换导航</span></div><h2>{title}</h2><div className="page-content">{children}</div></div>);
}// 具体页面组件
function HomePage() {const navigate = useNavigate();return (<PageTemplate title="首页"><p>欢迎访问我们的网站!</p><div className="button-group"><button onClick={() => navigate('/about')}className="btn push-btn">普通导航 (PUSH)</button><button onClick={() => navigate('/contact', { replace: true })}className="btn replace-btn">替换导航 (REPLACE)</button></div></PageTemplate>);
}function AboutPage() {return (<PageTemplate title="关于我们"><p>我们是一家专注于前端技术的公司。</p><p>使用 useNavigationType 可以增强用户体验!</p><ul className="feature-list"><li>检测导航来源</li><li>应用不同过渡效果</li><li>优化滚动行为</li><li>增强用户分析</li></ul></PageTemplate>);
}function ContactPage() {return (<PageTemplate title="联系我们"><div className="contact-card"><p>邮箱: contact@example.com</p><p>电话: (123) 456-7890</p><p>地址: 前端开发者大街 123</p></div></PageTemplate>);
}

四、useNavigationType实际应用场景

4.1、滚动位置恢复

function ProductList() {const navType = useNavigationType();const listRef = useRef(null);// 保存滚动位置useEffect(() => {const list = listRef.current;return () => {sessionStorage.setItem('productListScroll', list.scrollTop);};}, []);// 恢复滚动位置 - 仅对浏览器导航生效useEffect(() => {if (navType === 'POP') {const savedScroll = sessionStorage.getItem('productListScroll');if (savedScroll) {listRef.current.scrollTop = parseInt(savedScroll, 10);}}}, [navType]);return (<div ref={listRef} className="product-list">{/* 产品列表 */}</div>);
}

4.2、用户行为分析

function AnalyticsTracker() {const navType = useNavigationType();const location = useLocation();useEffect(() => {// 发送导航事件到分析平台analytics.track('navigation', {path: location.pathname,navigationType: navType,timestamp: Date.now()});}, [location, navType]);return null; // 无UI组件
}// 在应用中使用
<Routes><Route path="*" element={<AnalyticsTracker />} />
</Routes>

4.3、动态页面过渡

function AnimatedPage({ children }) {const navType = useNavigationType();const [direction, setDirection] = useState('from-right');useEffect(() => {setDirection(navType === 'POP' ? 'from-left' : 'from-right');}, [navType]);return (<motion.divinitial={{ x: direction === 'from-right' ? 300 : -300, opacity: 0 }}animate={{ x: 0, opacity: 1 }}exit={{ x: direction === 'from-right' ? -300 : 300, opacity: 0 }}transition={{ duration: 0.3 }}>{children}</motion.div>);
}

五、useNavigationType使用注意事项

1.初始加载:应用首次加载时,useNavigationType 返回 POP

2.SSR 兼容性:在服务器端渲染时总是返回 PUSH

3.路由上下文:必须在 <Router> 组件内部使用

4.性能考虑:导航类型变化会导致组件重新渲染

5.结合其他钩子:通常与 useLocation 和 useNavigate 一起使用

六、useNavigationType的替代方案比较

替代方案的优缺点
useNavigationType:可直接提供导航类型信息,但是仅适用于 React Router
history.listen: 是更底层的控制,但是需要手动管理监听器
自定义历史记录: 可以完全控制导航行为,但是实现复杂,需要额外代码

总结

useNavigationType 是 React Router 应用中一个强大的工具,特别适合需要根据导航来源定制行为的场景。通过合理使用,可以显著提升用户体验和应用性能。

相关文章:

React 第五十节 Router 中useNavigationType的使用详细介绍

前言 useNavigationType 是 React Router v6 提供的一个钩子&#xff0c;用于确定用户如何导航到当前页面。 它提供了关于导航类型的洞察&#xff0c;有助于优化用户体验和实现特定导航行为。 一、useNavigationType 核心用途 1.1、检测导航方式&#xff1a; 判断用户是通过…...

【笔记】在 MSYS2(MINGW64)中安装 Python 工具链的记录

#工作记录 &#x1f4cc; 安装背景 操作系统&#xff1a;MSYS2 MINGW64当前时间&#xff1a;2025年6月1日Python 版本&#xff1a;3.12&#xff08;默认通过 pacman 安装&#xff09;目标工具链&#xff1a; pipxnumpypipsetuptoolswheel &#x1f6e0;️ 安装过程与结果记录…...

npm install命令都做了哪些事情

npm install&#xff08;或其简写 npm i&#xff09;是 Node.js 项目中最重要的命令之一&#xff0c;它负责安装项目所需的所有依赖项。下面我将详细解释这个命令的完整执行过程和底层机制&#xff0c;让你彻底理解它背后的工作原理。 一、npm install 的完整工作流程 1. 依赖…...

Linux 学习-模拟实现【简易版bash】

1、bash本质 在模拟实现前&#xff0c;先得了解 bash 的本质 bash 也是一个进程&#xff0c;并且是不断运行中的进程 证明&#xff1a;常显示的命令输入提示符就是 bash 不断打印输出的结果 输入指令后&#xff0c;bash 会创建子进程&#xff0c;并进行程序替换 证明&#x…...

【中国・珠海】2025 物联网与边缘计算国际研讨会(IoTEC2025)盛大来袭!

2025 物联网与边缘计算国际研讨会&#xff08;IoTEC2025&#xff09;盛大来袭&#xff01; 科技浪潮奔涌向前&#xff0c;物联网与边缘计算已成为驱动各行业变革的核心力量。在此背景下&#xff0c;2025 物联网与边缘计算国际研讨会&#xff08;IoTEC2025&#xff09;即将震撼…...

企业级安全实践:SSL/TLS 加密与权限管理(二)

案例分析&#xff1a;成功与失败的经验教训 成功案例分析 以一家知名电商企业 ABC 为例&#xff0c;该企业每天处理数百万笔订单&#xff0c;涉及大量用户的个人信息、支付信息和商品数据。在网络安全建设方面&#xff0c;ABC 电商高度重视 SSL/TLS 加密与权限管理。 在 SSL…...

Java面试:从Spring Boot到分布式系统的技术探讨

场景一&#xff1a;电商平台的订单处理 面试官&#xff1a; “谢先生&#xff0c;假设我们在一个电商平台工作&#xff0c;你将如何使用Spring Boot构建一个订单处理服务&#xff1f;” 谢飞机&#xff1a; “这个简单&#xff0c;我会使用Spring Boot快速启动项目&#xff0…...

NodeJS全栈开发面试题讲解——P7 DevOps 与部署和跨域等

✅ 7.1 如何部署 Node.js 项目到生产环境&#xff1f;用过哪些工具&#xff1f; 面试官您好&#xff0c;我部署 Node.js 项目通常分为 构建 → 上传 → 启动服务 三步&#xff0c;常用工具包括 PM2、Nginx、Docker、Git Hooks、CI/CD 工具。 &#x1f6e0;️ 主要部署步骤&…...

中国高分辨率高质量地面CO数据集(2013-2023)

时间分辨率&#xff1a;日空间分辨率&#xff1a;1km - 10km共享方式&#xff1a;开放获取数据大小&#xff1a;9.83 GB数据时间范围&#xff1a;2013-01-01 — 2023-12-31元数据更新时间&#xff1a;2024-08-19 数据集摘要 ChinaHighCO数据集是中国高分辨率高质量近地表空气污…...

GO——内存逃逸分析

一、可能导致逃逸的5中情况 package mainimport "fmt"func main() {f1()f2()f3()f4()f5() }type animal interface {run() }type dog struct{}func (d *dog) run() {fmt.Println("狗在跑") }// 指针、map、切片为返回值的会发生内存逃逸 func f1() (*int,…...

MinVerse 3D触觉鼠标的技术原理与创新解析

MinVerse3D触觉鼠标通过三维交互和触觉反馈技术&#xff0c;彻底颠覆了传统二维鼠标的操作方式。用户在操作虚拟物体时&#xff0c;可以真实感知表面质感、重量和阻力。这种技术不仅为数字环境注入了深度与临场感&#xff0c;还在3D设计、游戏开发和工程仿真等领域展现了广泛潜…...

Spring Boot整活指南:从Helo World到“真香”定律

&#x1f4cc; 一、Spring Boot的"真香"本质&#xff08;不是996的福报&#xff09; 你以为Spring Boot只是个简化配置的工具&#xff1f;Too young&#xff01;它其实是程序员的​​摸鱼加速器​​。 ​​经典场景还原​​&#xff1a; 产品经理&#xff1a;“这个…...

Python-Selenium报错截图

报错截图设计方案&#xff1a; ​ 功能&#xff1a;截图层主要用来存放selenium运行时的报错截图信息 1. 截图路径管理 分层存储&#xff1a;在项目根目录下创建 screenshots 文件夹&#xff0c;并按日期进一步分类&#xff08;如 20250601&#xff09;。命名规范&#xff1…...

数论——质数和合数及求质数

质数和合数及求质数 一个大于 1 的自然数&#xff0c;除了 1 和它自身外&#xff0c;不能被其他自然数整除的数叫做质数&#xff1b;否则称为合数。其中&#xff0c;质数又称素数。有的资料用的词不同&#xff0c;但质数和素数其实是一回事。 规定 1 既不是质数也不是合数。 …...

nc 命令示例

nc -zv 实用示例 示例 1&#xff1a;测试单个 TCP 端口&#xff08;最常见&#xff09; 目标&#xff1a; 检查主机 webserver.example.com 上的 80 端口 (HTTP) 是否开放。 nc -zv webserver.example.com 80成功输出&#xff1a; Connection to webserver.example.com (19…...

乾元通渠道商中标青海省自然灾害应急能力提升工程基层防灾项目

近日&#xff0c;乾元通渠道商中标青海省自然灾害应急能力提升工程基层防灾项目&#xff0c;乾元通作为设备厂家&#xff0c;为项目提供通信指挥类装备&#xff08;多链路聚合设备&#xff09;QYT-X1。 青岛乾元通数码科技有限公司作为国家应急产业企业&#xff0c;深耕于数据调…...

Ubuntu取消开机用户自动登录

注&#xff1a;配置前请先设置登录密码&#xff0c;不同显示管理器配置方法不同&#xff0c;可用命令查看&#xff1a;cat /etc/X11/default-display-manager 一、LightDM 显示管理器&#xff0c;关闭 Ubuntu 系统用户自动登录 查找自动登录配置文件&#xff0c;可以看到类似 a…...

用 Spring Boot 静态资源映射 vs 用 Nginx 提供静态文件服务总结

【1】Spring Boot 静态资源映射 vs 用 Nginx 提供静态文件服务 ✅ 简短回答&#xff1a; 在性能、并发能力、缓存控制、安全性等方面&#xff0c;Nginx 完胜。 所以&#xff1a;如果你只是提供静态文件下载&#xff08;如图片、PDF、Excel 等&#xff09;&#xff0c;强烈推荐…...

openssl-aes-ctr使用openmp加速

openssl-aes-ctr使用openmp加速 openssl-aes-ctropenmp omp for openssl-aes-ctr 本文采用openssl-1.1.1w进行开发验证开发&#xff1b;因为aes-ctr加解密模式中&#xff0c;不依赖与上一个模块的加/解密的内容&#xff0c;所以对于aes-ctr加解密模式是比较适合进行并行加速的…...

PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南

随着互联网技术的不断发展&#xff0c;在线下单订水送水服务为人们所需要。分享一款 PHP 和 MySQL 搭建一个功能完善的在线订水送水小程序源码及搭建教程。这个系统将包含用户端和管理端两部分&#xff0c;用户可以在线下单、查询订单状态&#xff0c;管理员可以处理订单、管理…...

计算机网络第1章(上):网络组成与三种交换方式全解析

目录 一、计算机网络的概念二、计算机网络的组成和功能2.1 计算机网络的组成2.2 计算机网络的功能 三、电路交换、报文交换、分组交换3.1 电路交换&#xff08;Circuit Switching&#xff09;3.2 报文交换&#xff08;Message Switching&#xff09;3.3 分组交换&#xff08;Pa…...

Android studio进阶开发(七)---做一个完整的登录系统(前后端连接)

我们已经讲过了okhttp和登录系统的使用&#xff0c;我们今天做一个完整的登录系统&#xff0c;后端用springmybatis去做 数据库内容 -- 创建学生信息表 CREATE TABLE student_info (id SERIAL PRIMARY KEY, -- 添加自增主键name VARCHAR(255) NOT NULL,number INT NOT NULL,…...

计算机网络第1章(下):网络性能指标与分层模型全面解析

目录 一、计算机网络的性能指标1.1 性能指标1&#xff1a;速率1.2 性能指标2&#xff1a;带宽1.3 性能指标3&#xff1a;吞吐量1.4 性能指标4&#xff1a;时延1.5 性能指标5&#xff1a;时延带宽积1.6 性能指标6&#xff1a;往返时延1.7 性能指标7&#xff1a;信道利用率 二、计…...

恶意软件清理工具,让Mac电脑安全更简单

​你的Mac最近是不是开始表演"电子迷惑行为"&#xff1f;浏览器主页突然变成澳门赌场&#xff0c;风扇转得比直升机螺旋桨还猛......恭喜你&#xff01;可能中奖获得"恶意软件大礼包"&#xff01;别慌&#xff0c;今天就教你用恶意软件清理工具化身数字特工…...

HackMyVM-Jabita

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 05:20 EDT Nmap scan report for 192.168.43.1 Host is up (0.020s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan repo…...

112 Gbps 及以上串行链路的有效链路均衡

通道均衡已成为当今高速串行链路的关键机制。目前有许多均衡方案&#xff0c;例如发射机加重均衡、接收机CTLE&#xff08;连续时间线性均衡器&#xff09;、FFE&#xff08;前馈均衡器&#xff09;、DFE&#xff08;判决反馈均衡器&#xff09;和FEC&#xff08;前向纠错&…...

Mac 版不能连接华为 GaussDB 吗?我看 Windows 版可以连接?

&#x1f9d1;‍&#x1f4bb; GaussDB 用户 Mac 版不能连接华为 GaussDB 吗&#xff1f;我看Windows 版可以连接。 &#x1f9d1;‍&#x1f527; 官方技术中心 由于 GaussDB 数据库本身未支持 macOS 系统&#xff0c;所以在 macOS 上的 Navicat 中也未支持该数据库。 &…...

Python-13(永久存储)

创建并打开文件 open(file,mode)函数 该函数用于打开一个文件并返回对应的文件对象。 file参数指定的是文件路径和文件名&#xff0c;如果没有添加路径&#xff0c;那么默认将文件创建在python的主文件夹里面。mode参数指定的是打开的模式&#xff0c;r表示读取&#xff08;…...

《关于有序推动绿电直连发展有关事项的通知》核心内容

《关于有序推动绿电直连发展有关事项的通知》&#xff08;发改能源〔2025〕650 号&#xff09;由国家发展改革委和国家能源局于 2025 年 5 月 21 日联合印发&#xff0c;旨在明确绿电直连项目的适用范围、规划引导、运行管理、交易与价格机制以及组织保障等内容。 适用范围与原…...

数据结构-排序(1)

一&#xff0c;排序的基本概念 1.排序的定义 核心概念&#xff1a; 给定一个包含 n 个元素的序列 (R1, R2, ..., Rn) 和一个关键码 Ki&#xff08;通常是记录 Ri 的一个属性&#xff09;&#xff0c;排序的目标是找到一个排列 (p1, p2, ..., pn)&#xff0c;使得关键码序列 (K…...