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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83023.shtml
英文地址,請注明出處:http://en.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…