React 第四十四節Router中 usefetcher的使用詳解及注意事項

前言

useFetcherReact Router 中一個強大的鉤子,用于在不觸發頁面導航的情況下執行數據加載(GET)或提交(POST)

一、useFetcher 應用場景:

1、后臺數據預加載(如鼠標懸停時加載數據
2、無刷新表單提交(如點贊、評論
3、多步驟表單的局部提交
4、與當前頁面路由解耦的獨立數據操作

二、useFetcher 核心特性

非侵入式操作:不會影響當前路由或 URL。
狀態跟蹤:提供 state 屬性跟蹤操作狀態(idle/submitting/loading)
數據緩存:自動管理相同請求的緩存,避免重復提交
多實例支持:可在同一頁面多次使用,獨立管理不同操作。

三、useFetcher 基本使用

3.1、 初始化 Fetcher

import { useFetcher } from "react-router-dom";function LikeButton() {const fetcher = useFetcher();return (<fetcher.Form method="post" action="/api/like"><button type="submit">{fetcher.state === "submitting" ? "點贊中..." : "點贊"}</button></fetcher.Form>);
}

3.2、useFetcher核心 API 與參數

useFetcher() 返回一個對象,包含以下屬性和方法:

屬性/方法
Form: React 組件 用于 替代 <form>,提交時不會觸發頁面導航
submit(data, options): 函數 用于 手動提交數據(支持 FormData/對象/URL參數)
load(url): 函數 用于 手動觸發 GET 請求加載數據
data: any 表示 最近一次成功操作返回的數據
state"idle"/"submitting"/"loading" 表示 當前操作狀態

四、useFetcher 完整案例:用戶評論功能

4.1、 組件代碼

function CommentSection({ postId }) {const fetcher = useFetcher();const [commentText, setCommentText] = useState("");// 顯示提交后的評論(包括樂觀更新)const comments = fetcher.data?.comments || [];return (<div><h3>評論列表</h3><ul>{comments.map((comment) => (<li key={comment.id}>{comment.text}</li>))}</ul><fetcher.Formmethod="post"action={`/posts/${postId}/comment`}onSubmit={() => setCommentText("")} // 清空輸入框><textareaname="text"value={commentText}onChange={(e) => setCommentText(e.target.value)}/><button type="submit" disabled={fetcher.state !== "idle"}>{fetcher.state === "submitting" ? "提交中..." : "發布評論"}</button></fetcher.Form>{/* 顯示錯誤信息 */}{fetcher.data?.error && (<div className="error">{fetcher.data.error}</div>)}</div>);
}

4.2、 后端路由處理(示例)

// 路由配置中的 action 函數
export async function commentAction({ request, params }) {const postId = params.postId;const formData = await request.formData();try {// 模擬 API 調用const response = await fetch(`/api/posts/${postId}/comment`, {method: "POST",body: JSON.stringify({ text: formData.get("text") }),});if (!response.ok) throw new Error("評論失敗");const result = await response.json();// 返回更新后的評論列表return { comments: result.comments };} catch (error) {return { error: error.message };}
}

五、useFetcher 高級用法:手動控制數據流

5.1、手動提交數據

function SearchBox() {const fetcher = useFetcher();const [query, setQuery] = useState("");// 輸入變化時自動搜索(防抖)useEffect(() => {const timeoutId = setTimeout(() => {if (query) {fetcher.load(`/api/search?q=${query}`);}}, 300);return () => clearTimeout(timeoutId);}, [query]);return (<div><inputtype="text"value={query}onChange={(e) => setQuery(e.target.value)}/>{/* 顯示搜索結果 */}{fetcher.data?.results?.map((result) => (<div key={result.id}>{result.name}</div>))}</div>);
}

5.2、處理文件上傳

function AvatarUpload() {const fetcher = useFetcher();const handleFileChange = (e) => {const file = e.target.files[0];const formData = new FormData();formData.append("avatar", file);// 手動提交 FormDatafetcher.submit(formData, {method: "post",action: "/api/upload-avatar",encType: "multipart/form-data",});};return (<div><input type="file" onChange={handleFileChange} />{fetcher.data?.url && (<img src={fetcher.data.url} alt="用戶頭像" />)}</div>);
}

六、useFetcher使用注意事項

6.1、路由配置要求

必須使用數據路由(通過 createBrowserRouter 創建路由)

提交的目標路由(action 路徑)需要定義對應的 action 函數

6.2、性能優化

避免高頻調用 load/submit(如搜索框需防抖)

對相同 URL 的請求,React Router自動去重

6.3、錯誤處理

通過 fetcher.data 接收 action 返回的錯誤信息

使用 try/catch 包裹異步操作并返回錯誤狀態

6.4、與全局狀態配合

如果需要更新全局數據(如用戶信息),結合 useRevalidator() 重新驗證路由加載器

七、useFetcher與普通表單提交的對比

在這里插入圖片描述

總結:

我們可以用useFetcher 實現高度交互的 Web 應用,同時保持代碼的簡潔性可維護性
它是構建現代 SPA(單頁面應用) 中復雜交互(如即時保存、實時搜索)的理想工具。

如有錯誤之處,歡迎評論指正

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906707.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906707.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906707.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jmeter(三) - 測試計劃(Test Plan)的元件

1.簡介 上一篇已經教你如何通過JMeter來創建一個測試計劃&#xff08;Test Plan&#xff09;&#xff0c;那么這一篇我們就將JMeter啟動起來&#xff0c;創建一個測試計劃&#xff08;Test plan&#xff09;&#xff0c;給大家介紹一下測試計劃&#xff08;Test Plan&#xff…

應屆本科生簡歷制作指南

一、找一個專業的簡歷模板 首先&#xff0c;你需要訪問 Overleaf 的官方網站&#xff0c;也就是Overleaf, Online LaTeX Editor&#xff0c;進入頁面后&#xff0c;點擊注冊按鈕&#xff0c;按照提示填寫相關信息來創建一個屬于自己的賬號&#xff0c;通常需要填寫用戶名、郵箱…

[Spring Boot]整合Java Mail實現Outlook發送郵件

日常開發過程中,我們經常需要使用到郵件發送任務,比方說驗證碼的發送、日常信息的通知等。日常比較常用的郵件發送方包括:163、QQ等,本文主要講解Outlook SMTP的開啟方式、OutLook STARTTTL的配置、如何通過JavaMail來實現電子郵件的發送等。 Outlook作為微軟提供的企業電子…

【YOLOs-CPP-圖像分類部署】03-解決報錯

完整項目鏈接 點擊here下載! 上一篇問題 經過上一篇博客,我們得到了一個粗略版(會報錯)的項目。如何解決異常報錯呢? 我把問題在github上對作者進行了提問,但是2天后,依然沒有回復。 怎么辦呢?只能自己調試代碼了。 修改代碼 經過大量調試,修改了YOLO11CLASS.h…

Dockers Compose常用指令介紹

Dockers Compose常用指令 1、常用指令介紹 1.1、version 指令 頂級一級指令&#xff0c;指定 compose 指定文件格式版本 version: "3.8" services: 不同版本支持的功能不同。常用版本有 ‘2’, ‘3’, ‘3.8’ 等。 1.2、services 指令 頂級一級指令&#xff0…

謝飛機的Spring WebFlux面試之旅:從基礎到深入

謝飛機的Spring WebFlux面試之旅&#xff1a;從基礎到深入 面試場景&#xff1a;謝飛機的WebFlux面試 面試官&#xff1a;你好&#xff0c;謝飛機&#xff0c;請介紹一下你自己。 謝飛機&#xff1a;您好&#xff0c;我是一名有三年開發經驗的Java程序員&#xff0c;熟悉Spr…

Mysql增量備份與恢復

1.練習數據增量備份 增量備份&#xff1a;備份上次備份后&#xff0c;新產生的數據。 PERCONA Xtrabackup是一款強大的在線熱備份工具&#xff0c;備份過程中不鎖庫表&#xff0c;適合生產環境。支持完全備份與恢復、增量備份與恢復、差異備份與恢復。 安裝Xtrabackup 150、…

GStreamer (三)常?插件

常?插件 1、Source1.1、filesrc1.2. videotestsrc1.3. v4l2src1.4. rtspsrc和rtspclientsink 2、 Sink2.1. filesink2.2. fakesink2.3. xvimagesink2.4. kmssink2.5. waylandsink2.6. rkximagesink2.7. fpsdisplaysink 3 、視頻推流/拉流3.1. 本地推流/拉流3.1.1 USB攝像頭3.1…

Spring Boot與Kafka集成實踐:實現高效消息隊列

Spring Boot與Kafka集成實踐 引言 在現代分布式系統中&#xff0c;消息隊列是實現異步通信和解耦的重要組件。Apache Kafka作為一種高性能、分布式的消息隊列系統&#xff0c;被廣泛應用于大數據和實時數據處理場景。本文將介紹如何在Spring Boot項目中集成Kafka&#xff0c;…

Linux PXE批量裝機+無人值守技術(自動化裝機)

目錄 PXE所需條件 服務端所需服務 客戶端所需功能 1.準備系統安裝rpm倉庫 (1)安裝vsftpd服務 (2)啟動并設置開機自啟 (3)準備yum倉庫文件 2.安裝配置dhcpd服務 (1)安裝dhcoo軟件包 (2)配置dhcp服務 (3)啟動并設置開機自啟 3.部署TFTP服務 (1)安裝軟…

linux_cmake的筆記

include_directories()的使用 今天在運行一個cmakelist.txt如下所示時候&#xff0c;發現一個問題&#xff1a; cmake_minimum_required(VERSION 3.28) project(l_trajectoryError CXX) option(USE_UBUNTU_20 "Set to ON if you are using Ubuntu 20.04" OFF) find…

論文略讀:If Multi-Agent Debate is the Answer, What is the Question?

202502 arxiv 1 intro 多智能體辯論&#xff08;Multi-Agent Debate, MAD&#xff09;&#xff1a;通過讓多個智能體在大模型推理時展開多輪辯論&#xff0c;可提升生成內容的事實準確性和推理質量 但論文認為&#xff0c;目前多智能體辯論在大多數情況下不敵簡單的單智能體方…

使用RUST在Arduino上進行編程(MacOS,mega板)

近年來&#xff0c;RUST成為了嵌入式編程的熱門語言&#xff0c;本文通過實現&#xff08;1&#xff09;LED閃燈&#xff0c;以及&#xff08;2&#xff09;在console&#xff08;終端&#xff09;實現“Hello Rust World”兩項功能來完成實操的入門。 深入學習可以參考RUST語言…

(15)關于窗體的右鍵菜單的學習與使用,這關系到了信號與事件 event

&#xff08;1&#xff09;起因來源于 4.11 的老師講的例題&#xff0c;標準的&#xff0c;規范的使用右鍵菜單的代碼及參考資料如下&#xff1a; &#xff08;2&#xff09; 接著脫離上面的那個復雜的環境&#xff0c;用簡單的例子測試一下 &#xff1a; 說明老師講的都是對…

C 語言學習筆記(指針4)

內容提要 指針 函數指針與指針函數二級指針 指針 函數指針與指針函數 函數指針 定義 函數指針本質上是指針&#xff0c;是一個指向函數的指針。函數都有一個入口地址&#xff0c;所謂指向函數的指針&#xff0c;就是指向函數的入口地址。&#xff08;這里的函數名就代表…

C#串口打印機:控制類開發與實戰

C#串口打印機&#xff1a;控制類開發與實戰 一、引言 在嵌入式設備、POS 終端、工業控制等場景中&#xff0c;串口打印機因其穩定的通信性能和廣泛的兼容性&#xff0c;仍是重要的數據輸出設備。本文基于 C# 語言&#xff0c;深度解析一個完整的串口打印機控制類Printer&…

通過vue-pdf和print-js實現PDF和圖片在線預覽

npm install vue-pdf npm install print-js <template><div><!-- PDF 預覽模態框 --><a-modal:visible"showDialog":footer"null"cancel"handleCancel":width"800":maskClosable"true":keyboard"…

SQL解析工具JSQLParser

目錄 一、引言二、JSQLParser常見類2.1 Class Diagram2.2 Statement2.3 Expression2.4 Select2.5 Update2.6 Delete2.7 Insert2.8 PlainSelect2.9 SetOperationList2.10 ParenthesedSelect2.11 FromItem2.12 Table2.13 ParenthesedFromItem2.14 SelectItem2.15 BinaryExpressio…

安裝完dockers后就無法聯網了,執行sudo nmcli con up Company-WiFi,一直在加載中

Docker服務狀態檢查 執行 systemctl status docker 確認服務是否正常 若未運行&#xff0c;使用 sudo systemctl start docker && sudo systemctl enable docker 網絡配置沖突 Docker會創建docker0虛擬網橋&#xff0c;可能與宿主機網絡沖突 檢查路由表 ip route sho…

Docker 運維管理

Docker 運維管理 一、Swarm集群管理1.1 Swarm的核心概念1.1.1 集群1.1.2 節點1.1.3 服務和任務1.1.4 負載均衡 1.2 Swarm安裝準備工作創建集群添加工作節點到集群發布服務到集群擴展一個或多個服務從集群中刪除服務ssh免密登錄 二、Docker Compose與 Swarm 一起使用 Compose 三…