React 第四十九节 Router中useNavigation的具体使用详解及注意事项

前言

useNavigationReact Router 中一个强大的钩子,用于获取当前页面导航的状态信息
它可以帮助开发者根据导航状态优化用户体验,如显示加载指示器、防止重复提交等。

一、useNavigation核心用途

检测导航状态:判断当前是否正在进行页面导航或数据加载

防止用户操作冲突:在导航过程中禁用表单提交按钮

优化用户体验:在页面加载期间显示加载指示器

预加载感知:感知即将发生的导航并提前准备

二、useNavigation 基本用法

import { useNavigation } from "react-router-dom";function NavigationStatus() {const navigation = useNavigation();return (<div><p>当前导航状态: {navigation.state}</p><p>目标路径: {navigation.location?.pathname || "无"}</p></div>);
}

三、useNavigation 返回值详解

useNavigation 返回一个包含以下属性的对象

在这里插入图片描述

四、useNavigation 导航状态详解

"idle":没有导航活动

"loading":正在加载新页面(页面跳转中)

"submitting":正在提交表单数据

五、useNavigation 完整代码案例

5.1、全局加载指示器

import { useNavigation } from "react-router-dom";function GlobalLoadingIndicator() {const navigation = useNavigation();// 当有导航活动时显示加载指示器const isLoading = navigation.state !== "idle";return isLoading ? (<div className="loading-overlay"><div className="spinner"></div>{navigation.state === "submitting" && (<p>提交数据中...</p>)}{navigation.state === "loading" && (<p>加载页面中...</p>)}</div>) : null;
}

5.2、表单提交状态管理

import { useNavigation } from "react-router-dom";function SubmitButton() {const navigation = useNavigation();const isSubmitting = navigation.state === "submitting";return (<button type="submit" disabled={isSubmitting}className={isSubmitting ? "submitting" : ""}>{isSubmitting ? "提交中..." : "提交表单"}</button>);
}function ContactForm() {return (<form method="post" action="/contact"><input type="text" name="name" placeholder="姓名" required /><input type="email" name="email" placeholder="邮箱" required /><textarea name="message" placeholder="留言" rows={4} required /><SubmitButton /></form>);
}

5.3、基于导航状态优化用户体验

import { useNavigation } from "react-router-dom";function ProductPage() {const navigation = useNavigation();// 当即将导航到新页面时,显示骨架屏const isNavigating = navigation.state === "loading";const targetIsProduct = navigation.location?.pathname?.startsWith("/product/");return (<div className="product-container">{isNavigating && targetIsProduct ? (<ProductSkeleton />) : (<ProductDetails />)}<RelatedProducts />{/* 在提交评论时禁用评论表单 */}<CommentForm disabled={navigation.state === "submitting"} /></div>);
}function ProductSkeleton() {return (<div className="skeleton"><div className="skeleton-image"></div><div className="skeleton-title"></div><div className="skeleton-description"></div></div>);
}

六、useNavigation 高级用法:预加载感知

import { useNavigation, Link } from "react-router-dom";function ProductList({ products }) {const navigation = useNavigation();// 获取即将导航到的产品IDconst nextProductId = navigation.location?.pathname?.split("/")[2];return (<div><h2>产品列表</h2><ul>{products.map(product => (<li key={product.id}><Link to={`/product/${product.id}`}>{product.name}{/* 高亮即将访问的产品 */}{nextProductId === product.id && " (正在加载...)"}</Link></li>))}</ul></div>);
}

七、useNavigation 与相似钩子的对比

钩子 用途 返回信息
useNavigation:用于 获取当前导航状态、目标位置等
useLocation:用于 获取当前URL信息,返回信息包含:当前路径、查询参数等
useNavigate:用于 编程式导航,返回:导航函数
useLoaderData:用于 获取路由加载器提供的数据,返回: 加载的数据
useActionData: 用于 获取表单提交后返回的数据,返回: 动作返回的数据

八、注意事项

8.1、理解状态变化:

"submitting" → "loading" → "idle" 是典型的状态变化流程

表单提交后会立即跳转到新页面

8.2、避免过度使用:

只在需要响应导航状态的组件中使用

避免在性能敏感的组件中使用

8.3、与数据加载的配合:

useNavigation 关注导航状态

useLoaderData 关注数据加载结果

两者可以配合使用优化加载体验

8.4、错误处理:

function SmartButton() {const navigation = useNavigation();const actionData = useActionData();const isSubmitting = navigation.state === "submitting";const hasError = actionData?.error;return (<button type="submit" disabled={isSubmitting || hasError}>{isSubmitting ? "处理中..." : "提交"}</button>);
}

九、最佳实践

9.1、 创建导航感知组件

function NavigationAwareLink({ to, children }) {const navigation = useNavigation();const isActive = navigation.location?.pathname === to;const isNavigatingTo = navigation.state === "loading" && navigation.location?.pathname === to;return (<Link to={to} className={`nav-link ${isActive ? "active" : ""} ${isNavigatingTo ? "navigating" : ""}`}>{children}{isNavigatingTo && <span className="loading-dot"></span>}</Link>);
}

9.2、 结合 Suspense 优化加载体验

import { useNavigation } from "react-router-dom";
import { Suspense } from "react";function Dashboard() {const navigation = useNavigation();return (<div><h1>控制面板</h1><Suspense fallback={<Spinner />}>{navigation.state === "idle" ? (<DashboardContent />) : (<DashboardSkeleton />)}</Suspense></div>);
}

总结

useNavigationReact Router 中用于增强用户体验的关键钩子,通过它开发者可以:

1.精确感知导航状态(空闲、加载中、提交中

2.根据状态动态调整 UI(显示加载指示器、禁用按钮等)

3.提前预知用户即将访问的页面

4.创建更加流畅的导航体验

合理使用 useNavigation 可以显著提升应用的交互质量和用户满意度,特别是在需要处理异步操作和页面过渡的场景中。

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

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

相关文章

列表单独展开收起同时关闭其余子项的问题优化

如图所示&#xff0c;当在列表中&#xff0c;需要分别单独点开子选项时&#xff0c;直接这样用一个index参数判断即可&#xff0c;非常简单方便&#xff0c;只需要满足点开当前index,然后想同index用null值自动关闭即可

WPF【11_5】WPF实战-重构与美化(MVVM 实战)

11-10 【重构】创建视图模型&#xff0c;显示客户列表 正式进入 MVVM 架构的代码实战。在之前的课程中&#xff0c; Model 和 View 这部分的代码重构实际上已经完成了。 Model 就是在 Models 文件夹中看到的两个文件&#xff0c; Customer 和 Appointment。 而 View 则是所有与…

LangChain-结合魔塔社区modelscope的embeddings实现搜索

首先要安装modelscope pip install modelscope 安装完成后测试 from langchain_community.embeddings import ModelScopeEmbeddingsembeddings ModelScopeEmbeddings(model_id"iic/nlp_gte_sentence-embedding_chinese-base")text "这是一个测试句子"…

可定制化货代管理系统,适应不同业务模式需求!

在全球化贸易的浪潮下&#xff0c;货运代理行业扮演着至关重要的角色。然而&#xff0c;随着市场竞争的日益激烈&#xff0c;货代企业面临着越来越多的挑战&#xff1a;客户需求多样化、业务流程复杂化、运营成本上升、利润空间压缩……这些挑战迫使货代企业不断寻求创新和突破…

Lyra学习笔记2 GFA_AddComponents与ULyraPlayerSpawningManagerComponent

目录 前言GameFeatureAction_AddComponentsULyraPlayerSpawningManagerComponent缓存所有PlayerStart位置选择位置 前言 1.以control模式为例 2.比较散&#xff0c;想单独拿出一篇梳理下Experience的流程 GameFeatureAction_AddComponents 这部分建议看 《InsideUE5》GameFeatu…

进程生命周期

进程生命周期 Linux是多任务操作系统&#xff0c;系统中的每个进程能够分时复用CPU时间片&#xff0c;通过有效的进程调度策略实现多任务并行执行。进程在被CPU调度运行&#xff0c;等待CPU资源分配以及等待外部事件时会处于不同的状态。进程状态如下&#xff1a; 创建状态&a…

文字转图片的字符画生成工具

软件介绍 今天要介绍的这款软件可以将文字转换成图片的排列形式&#xff0c;非常适合需要将文字图形化的场景&#xff0c;建议有需要的朋友收藏。 软件名称与用途 这款软件名为《字符画大师》&#xff0c;是一款在网吧等场所非常流行的聊天辅助工具&#xff0c;其主要功能就…

历年南京大学计算机保研上机真题

2025南京大学计算机保研上机真题 2024南京大学计算机保研上机真题 2023南京大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school Count Number of Binary Strings 题目描述 Given a positive integer n n n ( 3 ≤ n ≤ 90 3 \leq n \leq 90 3≤n≤…

王树森推荐系统公开课 排序06:粗排模型

shared bottom 表示神经网络被所有特征共享。精排模型主要开销在神经网络&#xff0c;神经网络很大且很复杂。 每做一次推荐&#xff0c;用户塔只做一次推理。物品塔存放入向量数据库。 后期融合模型常用于召回&#xff0c;前期融合模型常用于精排。 物品塔短时间内比较稳…

VSCode的下载与安装(2025亲测有效)

目录 0 前言1 下载2 安装3 后记 0 前言 丫的&#xff0c;谁懂啊&#xff0c;尝试了各种办法不行的话&#xff0c;我就不得不拿出我的最后绝招了&#xff0c;卸载&#xff0c;重新安装&#xff0c;我经常要重新安装&#xff0c;所以自己写了一个博客&#xff0c;给自己&#xf…

端午节互动网站

端午节互动网站 项目介绍 这是一个基于 Vue 3 Vite 开发的端午节主题互动网站&#xff0c;旨在通过有趣的交互方式展示中国传统端午节文化。网站包含三个主要功能模块&#xff1a;端午节介绍、互动包粽子游戏和龙舟竞赛游戏。 预览网站&#xff1a;https://duanwujiekuaile…

Python+requests+pytest接口自动化测试框架的搭建(全)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 框架的设计思路 首先要明确进行接口自动化需要的步骤&#xff0c;如下图所示&#xff1a; 然后逐步拆解需要完成的工作&#xff1a; 1&#xff09;了解分析需求&…

OpenCV视觉图片调整:从基础到实战的技术指南

引言:数字图像处理的现代意义与OpenCV深度应用 在人工智能与计算机视觉蓬勃发展的今天,图像处理技术已成为多个高科技领域的核心支撑。根据市场研究机构Grand View Research的数据,全球计算机视觉市场规模预计将从2022年的125亿美元增长到2030年的253亿美元,年复合增长率达…

JS手写代码篇---手写节流函数

8、节流函数 什么是节流函数&#xff1f; 指规定一个单位时间&#xff0c;在这个单位时间内&#xff0c;只能有一次触发事件的回调函数执行&#xff0c;如果在同一个单位时间内某事件被触发多次&#xff0c;只有一次能生效。 与防抖函数有什么区别&#xff1f; 防抖函数是延…

2025年05月30日Github流行趋势

项目名称&#xff1a;agenticSeek 项目地址url&#xff1a;https://github.com/Fosowl/agenticSeek项目语言&#xff1a;Python历史star数&#xff1a;13040今日star数&#xff1a;1864项目维护者&#xff1a;Fosowl, steveh8758, klimentij, ganeshnikhil, apps/copilot-pull-…

node_modules包下载不下来

如果项目里面的package-lock.json有resolved &#xff0c;就指向了包的下载来源&#xff0c;如果这个网址挂了&#xff0c;那npm i 就会一直卡着。而且&#xff0c;在终端去修改 npm的镜像是没有用的 解决办法是:把项目里面的 lock文件 .npmrc都删了 然后重新下载就可以了

OramaCore 是您 AI 项目、答案引擎、副驾驶和搜索所需的 AI 运行时。它包括一个成熟的全文搜索引擎、矢量数据库、LLM界面和更多实用程序

一、软件介绍 文末提供程序和源码下载 OramaCore 是您的项目、答案引擎、副驾驶和搜索所需的 AI 运行时。 它包括一个成熟的全文搜索引擎、矢量数据库、LLM具有行动计划和推理功能的接口、用于根据数据编写和运行您自己的自定义代理的 JavaScript 运行时&#xff0c;以及更多…

小白成长之路-计算机网络(四)

文章目录 前言一、网络连接查看1.netstat2.ss3.bond绑定3.1准备好这三个文件3.2添加bond配置文件3.3关闭网络图形化服务3.4重启 4.Linux下的抓包工具Wireshark 5、web压力测试工具6、路由追踪命令 二、[练习题](https://blog.csdn.net/m0_70730767/article/details/148262716?…

CppCon 2014 学习:Lock-Free Programming

你这段文字讲的是“为什么要使用无锁&#xff08;Lock-Free&#xff09;代码”&#xff0c;我帮你总结并解释一下&#xff1a; 为什么选择无锁代码&#xff1f; 并发性和可扩展性&#xff08;Concurrency and scalability&#xff09; 无锁算法允许多个线程同时操作共享数据&a…

Proteus寻找元器件(常见)

汇总&#xff1a; 1 主控芯片 STM32系列&#xff08;32位&#xff09; AT89C51&#xff08;51系列&#xff09; 2显示模块 OLED 3 按键 Button 4 电阻电容 Res&#xff08;电阻&#xff09; Cap&#xff08;电容&#xff09; 5 驱动模块 L298N&#xff08;电机驱动芯片&am…