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

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(单页面应用) 中复杂交互(如即时保存、实时搜索)的理想工具。

如有错误之处,欢迎评论指正

相关文章:

React 第四十四节Router中 usefetcher的使用详解及注意事项

前言 useFetcher 是 React Router 中一个强大的钩子&#xff0c;用于在不触发页面导航的情况下执行数据加载&#xff08;GET&#xff09;或提交&#xff08;POST&#xff09;。 一、useFetcher 应用场景&#xff1a; 1、后台数据预加载&#xff08;如鼠标悬停时加载数据&…...

33、魔法防御术——React 19 安全攻防实战

一、奥术护盾&#xff08;基础防御&#xff09; 1. 敏感数据加密术 // cryptoUtils.js - 数据加密工具export const encrypt (data) > {// 实际项目应使用Web Crypto API或crypto-jsreturn btoa(encodeURIComponent(data));};​export const decrypt (data) > {try {…...

NVM 安装与配置指南

简介 Node Version Manager&#xff08;NVM&#xff09;是一个常用的 Node.js 版本管理工具&#xff0c;可用于在开发过程中方便地切换不同版本的 Node.js。通过 NVM&#xff0c;用户可以根据项目需求选择不同的 Node.js 版本&#xff0c;而无需手动安装和卸载多个版本的 Node…...

SpringMVC04所有注解按照使用位置划分| 按照使用层级划分(业务层、视图层、控制层)

目录 一、所有注解按照使用位置划分&#xff08;类、方法、参数&#xff09; 1. 类级别注解 2. 方法级别注解 3. 参数级别注解 4. 字段/返回值注解 二、按照使用层级划分&#xff08;业务层、视图层、控制层&#xff09; 1、控制层&#xff08;Controller Layer&#x…...

【数据库】-1 mysql 的安装

文章目录 1、mysql数据库1.1 mysql数据库的简要介绍 2、mysql数据库的安装2.1 centos安装2.2 ubuntu安装 1、mysql数据库 1.1 mysql数据库的简要介绍 MySQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典MySQL AB公司开发&#xff0c;目前…...

MySQL与Redis一致性问题分析

一、一致性问题概述 1.1 什么是一致性问题&#xff1f; 在数据库-缓存架构中&#xff0c;当MySQL中的数据&#xff08;最新值&#xff09;与Redis缓存中的数据&#xff08;缓存旧值&#xff09;出现差异时&#xff0c;由于程序总是优先读取Redis缓存&#xff0c;就会导致应用…...

Xshell传输文件

新建文件 点击新建 完善主机地址 然后输入我们的远端服务器的SSH协议 一般的是这样的ssh -p 44562 rootregion-1.autodl.com 由于Xshell比较特殊我们输入ssh rootregion-1.autodl.com 44562这样的形式 然后输入服务器的密码即可...

怎样用 esProc 为大主子表关联提速

类似订单和明细表这样的主子表关联比较常见&#xff0c;在 SQL 中&#xff0c;这种关联用 JOIN 实现&#xff0c;在两个表都很大的情况下&#xff0c;常常出现计算速度非常慢的现象。 如果预先将主子表都按照主键有序存储&#xff0c;就可以使用归并算法实现关联。这种算法只需…...

打卡day31

文件的规范拆分和写法 知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 作业&#xff1a;尝试针对之前的心脏病项目&#xff0c;准备拆分的项目文件&#xff0c;思考下哪些部分可以未来复用。 导入依赖库 # 忽视警告 import warnings warn…...

编译原理的部分概念

解释程序&#xff1a;边解释边执行&#xff1a;不断读取源程序的语句&#xff0c;解释语句&#xff0c;读取此语句需要的数据&#xff0c;根据执行结果读取下一条语句&#xff0c;继续解释执行&#xff0c;直到返回结果。 编译程序&#xff1a;将源程序完整地转换成机器语言程…...

Java中字符串(String类)的常用方法

以下是Java中字符串&#xff08;String类&#xff09;的常用方法分类详解&#xff0c;包含核心方法说明和示例代码&#xff1a; 一、字符串基础信息 方法说明示例输出length()返回字符串长度"Hello".length()5isEmpty()判断字符串是否为空&#xff08;长度是否为0&a…...

什么是 ERP,中国企业如何科学应用 ERP

中国企业在引入 ERP 系统过程中&#xff0c;常因盲目跟风大型企业选型、忽视自身业务适配性&#xff0c;导致系统功能过剩、实施成本高企、员工接受度低等问题&#xff0c;最终造成项目成功率不足 10%。因此&#xff0c;理性认知 ERP 的价值定位与本土化实施路径&#xff0c;成…...

使用SQLite Expert个人版VACUUM功能修复数据库

使用SQLite Expert个人版VACUUM功能修复数据库 一、SQLite Expert工具简介 SQLite Expert 是一款功能强大的SQLite数据库管理工具&#xff0c;分为免费的个人版&#xff08;Personal Edition&#xff09;和收费的专业版&#xff08;Professional Edition&#xff09;。其核心功…...

同源策略深度防御指南:CSP 高级应用与企业微信全场景适配(含 report-uri 实战)

一、CSP 核心指令权威解析与企业微信适配 内容安全策略&#xff08;CSP&#xff09;通过Content-Security-Policy响应头实现资源加载的细粒度控制&#xff0c;其核心指令与企业微信场景强相关&#xff1a; 1.1 frame-ancestors&#xff1a;iframe 嵌入源控制 权威规范&#…...

【AGI】大模型微调技术-四大微调框架

【AGI】大模型微调技术-四大微调框架 &#xff08;1&#xff09;微调基础概念介绍1.1 微调基本概念1.2 全量微调与高效微调1.3 模型微调的优劣势分析1.4 高效微调与LoRA、QLoRA &#xff08;2&#xff09;高效微调的应用场景&#xff08;3&#xff09;流微调工具介绍3.1 unslot…...

小白编程学习之巧解「消失的数字」

一、引言&#xff1a;一个看似简单的「找不同」问题 今天遇到一道有趣的算法题&#xff1a;给定一个含 n 个整数的数组 nums&#xff0c;其中每个元素都在 [1, n] 范围内&#xff0c;要求找出所有在 [1, n] 中但未出现在数组中的数字。 这让我想起小时候玩的「找错题」游戏 —…...

在 Git 中添加子模块(submodule)的详细步骤

在 Git 中添加子模块&#xff08;submodule&#xff09;的详细步骤如下&#xff1a; 1. 添加子模块 命令格式&#xff1a; git submodule add <仓库URL> [目标路径]仓库URL&#xff1a;子模块的 Git 仓库地址&#xff08;HTTP/SSH 均可&#xff09;。目标路径&#xff…...

瑞萨单片机笔记

1.CS for CC map文件中显示变量地址 Link Option->List->Output Symbol information 2.FDL库函数 pfdl_status_t R_FDL_Write(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_u16 bytecount) pfdl_status_t R_FDL_Read(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_…...

单片机复用功能重映射Remap功能

目录 一、查看“DS5319 stm32f10x中等密度mcu数据手册&#xff08;英文&#xff09;”手册 二、查看“RM0008 STM32F10xxx参考手册&#xff08;中文&#xff09;”手册 三、重映射&#xff08;Remap&#xff09;功能程序编写 自己学习过程中容易遗忘的知识点&#xff0c;记录…...

小白入门FPGA设计,如何快速学习?

很多刚入门的小伙伴&#xff0c;初次听说FPGA&#xff08;现场可编程门阵列&#xff09;&#xff0c;脑子里只有一个字&#xff1a;玄&#xff01; 什么“时序逻辑”“Verilog”“Vivado”&#xff0c;仿佛一夜之间掉进了电子黑魔法的深坑。 但真相是—— FPGA&#xff0c;其实…...

友思特应用 | LCD显示屏等玻璃行业的OCT检测应用

导读 光学相干层析成像(OCT)是一种非侵入式光学成像方法&#xff0c;提供微米尺度的空间分辨率&#xff0c;能够生成内部结构截面图像。自20世纪90年代初发明第一台OCT以来&#xff0c;它在眼科领域得到了广泛应用&#xff0c;并成为临床诊断的黄金标准之一。除了在生物医学领…...

Python的sys模块:系统交互的关键纽带

Python的sys模块&#xff1a;系统交互的关键纽带 对话实录 小白&#xff1a;&#xff08;挠头&#xff09;我知道 Python 能做很多事&#xff0c;可怎么让它和计算机系统‘交流’呢&#xff0c;比如获取系统信息、处理命令行参数&#xff1f; 专家&#xff1a;&#xff08;微…...

若依项目集成sentinel、seata和shardingSphere

集成组件包括MySQL分库分表及读写分离、seata以及Sentinel 若依项目文档连接 代码下载地址 需要结合ruoyi代码配合看&#xff0c;前提是熟悉基本代码结构&#xff0c;熟悉feign调用和基础网关配置等。 采用的版本信息 <java.version>1.8</java.version> <spr…...

张 推进对话式心理治疗:SOULSPEAK的聊天机器人

SOULSPEAK的聊天机器人 利用大语言模型(LLM)来提供低成本的心理治疗服务,旨在解决传统心理咨询在隐私、成本和可及性方面的不足。以下是核心内容的通俗解读: 1. 研究背景:传统心理治疗的困境 问题:全球心理健康问题日益严重(如焦虑、抑郁人数激增),但传统心理咨询受…...

java中的Filter使用详解

Filter&#xff08;过滤器&#xff09;是 Java Web 开发的核心组件之一&#xff0c;用于在请求到达 Servlet 或响应返回客户端之前进行拦截和处理。以下是其核心功能、使用方法和实际场景的详细解析&#xff1a; 一、Filter 的作用与原理 核心作用 Filter 充当请求与响应之间的…...

BERT 作为Transformer的Encoder 为什么采用可学习的位置编码

摘要 BERT 在位置编码上与原始 Transformer 论文中的 sin/cos 公式不同&#xff0c;选择了可学习&#xff08;learned&#xff09;的位置嵌入方案。本文将从 Transformer 原始位置编码选项入手&#xff0c;分析 BERT 选择 learned positional embeddings 的四大核心原因&#x…...

Vue百日学习计划Day43-45天详细计划-Gemini版

Day 43: Composable 函数基础与抽取简单逻辑 (~3 小时) 本日目标: 理解 Composable 函数的概念、优势&#xff0c;并学会如何将简单的、无状态的逻辑抽取为 Composable。所需资源: Vue 3 官方文档 (组合式函数): https://cn.vuejs.org/guide/reusability/composables.html 学…...

Kotlin 协程 (二)

Kotlin 协程提供了丰富的功能&#xff0c;能够高效地处理并发和异步任务。以下是对 Kotlin 协程中常见概念和功能的详细讲解&#xff0c;包括它们的定义、作用、使用场景以及最佳实践。 1. 协程核心概念 1.1 CoroutineScope 定义&#xff1a;CoroutineScope 是协程作用域的抽…...

Linux 下 rsync 工具详解与实用指南

Linux 下 rsync 工具详解与实用指南 一、什么是 rsync&#xff1f; rsync&#xff08;remote sync&#xff09;是 Linux/Unix 系统下常用的数据同步和备份工具。它可以高效地在本地与远程主机之间同步文件和目录&#xff0c;支持增量同步、断点续传、权限保留等功能&#xff…...

2025年医美行业报告60+份汇总解读 | 附 PDF 下载

原文链接&#xff1a;https://tecdat.cn/?p42122 医美行业在消费升级与技术迭代的双重驱动下&#xff0c;已从边缘市场逐步走向主流。数据显示&#xff0c;2024 年中国医美市场规模突破 3000 亿元&#xff0c;年复合增长率达 15%&#xff0c;但行业仍面临正品率不足、区域发展…...

汉得集星獭1.8.0正式发布,高效集成再赋能!

汉得企业级系统集成平台 &#xff08;中文名集星獭&#xff0c;英文名JeeStar&#xff09;1.8.0版本于2025年4月正式发布 。 集星獭是一款一站式多系统集成、多云集成、多端集成、多协议集成、多设备集成、数据集成、页面集成的全域集成解决方案产品。 此次发布主要聚焦于以下…...

一文深度解析:Pump 与 PumpSwap 的协议机制与技术差异

在 Solana 链上&#xff0c;Pump.fun 和其延伸产品 PumpSwap 构成了 meme coin 发行与流通的两大核心场景。从初期的游戏化发行模型&#xff0c;到后续的自动迁移与交易市场&#xff0c;Pump 系列协议正在推动 meme coin 从“爆发性投机”走向“协议化运营”。本文将从底层逻辑…...

数据库实验——备份与恢复

一、目的&#xff08;本次实验所涉及并要求掌握的知识点&#xff09; 1.掌握SQL server的备份与恢复 二、实验内容与设计思想&#xff08;设计思路、主要数据结构、主要代码结构、主要代码段分析&#xff09; 验证性实验 实验1&#xff1a;在资源管理器中建立备份设备实验 …...

抓包分析工具与流量监控软件

目录 一、抓包分析工具&#xff1a;定位问题的“放大镜” 1.1 工作原理简述 1.2 主流工具盘点 1.3 抓包的实战应用 二、流量监控软件&#xff1a;网络全景的“雷达系统” 2.1 功能特征 2.2 常用工具概览 2.3 实战应用场景 五、结语&#xff1a;深入可见&#xff0c;安…...

Go语言实战:使用 excelize 实现多层复杂Excel表头导出教程

Go 实现支持多层复杂表头的 Excel 导出工具 目录 项目介绍依赖说明核心结构设计如何支持多层表头完整使用示例总结与扩展 项目介绍 在实际业务系统中&#xff0c;Excel 文件导出是一项常见功能&#xff0c;尤其是报表类需求中常见的复杂多级表头&#xff0c;常规表格组件往…...

【算法】定长滑动窗口5.20

定长滑动窗口算法&#xff1a; 算法思路 滑动窗口遍历字符串&#xff1a;窗口大小为 k &#xff0c;遍历字符串每个字符&#xff0c;维护窗口内元音字母数量。 ​统计窗口内元音&#xff1a;当字符是元音&#xff08;a/e/i/o/u&#xff09;时&#xff0c;计数器 vowel 加 1。…...

Java操作Elasticsearch 之 [Java High Level REST Clientedit]

<a name"VbjtD"></a> 1. 简述 Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架&#xff0c;向 Elasticsearch 中存储和从 Elasticsearch 中查询&#xff0c;格式是json。向 Elasticsearch 中存储数据&#xff0c;其实就是向 es 中的 index 下…...

数据集划分与格式转换:从原始数据到模型训练的关键步骤

在计算机视觉项目中&#xff0c;数据集的合理划分和格式转换是实现高效模型训练的基础。本文将详细介绍如何将图片和标注数据按比例切分为训练集和测试集&#xff0c;以及常见的数据格式转换方法&#xff0c;包括 JSON 转 YOLO 格式和 XML 转 TXT 格式。 一、将图片和标注数据…...

MinerU

简介 MinerU 是一款功能全面的文档处理系统&#xff0c;旨在将 PDF 和其他文档格式转换为机器可读的格式&#xff0c;例如 Markdown 和 JSON。该系统专注于在保留文档结构的同时&#xff0c;准确提取文档内容&#xff0c;处理复杂的布局&#xff0c;并转换公式和表格等特殊元素…...

Vue百日学习计划Day46-48天详细计划-Gemini版

Day 46: <KeepAlive> - 组件缓存与优化 (~3 小时) 本日目标: 理解 <KeepAlive> 的作用&#xff0c;学会如何使用它来缓存组件实例&#xff0c;从而优化应用性能和用户体验。所需资源: Vue 3 官方文档 (<KeepAlive>): https://cn.vuejs.org/guide/built-ins/…...

微软的 Windows Linux 子系统现已开源

微软宣布其 Windows Linux 子系统 (WSL) 开源&#xff0c;开放代码供社区成员贡献。自近九年前推出适用于 Windows 10 的 WSL 以来&#xff0c;微软多年来一直致力于开源这项在 Windows 中启用 Linux 环境的功能。 Windows 首席执行官 Pavan Davuluri 表示&#xff1a;“这是开…...

Axure中使用动态面板实现图标拖动交换位置

要在Axure中实现图标拖动交换位置的功能&#xff0c;可以通过动态面板结合交互事件来实现。 实现步骤 准备图标元素 将每个图标转换为动态面板&#xff08;方便拖动和交互&#xff09;。 设置拖动交互 选中图标动态面板 → 添加“拖动时”交互 → 选择“移动”当前动态面板&am…...

深入浅出:Spring Cloud Gateway 扩展点实践指南

文章目录 前言一、为什么需要扩展 Spring Cloud Gateway&#xff1f;二、Spring Cloud Gateway 核心扩展点三、扩展点实战&#xff1a;代码与配置详解3.1 全局过滤器&#xff08;GlobalFilter&#xff09;3.2 路由过滤器&#xff08;GatewayFilter&#xff09;2.3 自定义路由断…...

SCAU18923--二叉树的直径

18923 二叉树的直径 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC Description 给定一棵二叉树&#xff0c;你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点…...

理解 RESTful 风格:现代 Web 服务的基石

在当今的互联网时代&#xff0c;Web 服务成为了连接各种应用和系统的关键。而 RESTful 风格&#xff0c;作为一种广泛采用的架构风格&#xff0c;为设计和实现 Web 服务提供了一套简洁而强大的指导原则。本文将深入探讨 RESTful 风格的核心概念、优势以及如何在实际项目中应用它…...

大模型(3)——RAG(Retrieval-Augmented Generation,检索增强生成)

文章目录 1. 核心组成2. 工作流程3. 训练方式4. 优势与局限5. 应用场景6. 典型模型变体总结 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;是一种结合了信息检索与文本生成的技术&#xff0c;旨在通过引入外部知识库提升生成内容的准确性…...

电子科技大学软件工程实践期末

Java基础 面向对象 Java高级编程 2023&#xff1a; 软件工程基础 ch1软件工程概述 软件的概念和特点 软件危机的概念以及产生的原因 软件工程的定义 三要素 应用软件工程的原因 三要素&#xff1a;工具&#xff0c;方法&#xff0c;过程 ch2 软件过程 软件生命周期 软件过程…...

线上jvm假死问题排查

1.线上告警接口超时 看接口是用户服务&#xff0c;查看nacos服务实例&#xff0c;发现有一个节点已经下线了 3.找到对应节点所在服务器&#xff0c;jps -l 命令发现用户服务还在&#xff0c;初步判断是假死 4.使用 jstat -gc 进程id 1000 每秒打印gc情况&#xff0c;发现频繁…...

Redis中SETNX、Lua 脚本和 Redis事务的对比

在 Redis 中&#xff0c;SETNX、Lua 脚本 和 Redis 事务 都可以用于实现原子性操作&#xff0c;但它们的适用场景和能力范围不同。以下是详细对比和原因分析&#xff1a; 1. SETNX 的原子性与局限性 (1) 原子性保证 SETNX&#xff08;SET if Not eXists&#xff09; 是 Redis…...

Nginx配置记录访问信息

文章目录 方法一&#xff1a;使用Nginx原生配置记录访问信息方法二&#xff1a;使用Nginx_headers_more模块记录更加详细的信息 Nginx被广泛应用于各种场景如&#xff1a;Web服务器、反向代理服务器、负载均衡器、Web应用防火墙(WAF)等 在实际的产品开发中&#xff0c;无论是功…...