React 第四十一节Router 中 useActionData 使用方法案例以及注意事项
一、useActionData前言
useActionData
是 React Router 提供的一个钩子函数,用于获取在路由的 action 函数中返回的数据。它通常与表单提交(通过 <Form>
组件)配合使用,用于处理表单提交后的服务器响应数据(如错误信息、成功状态等)。
二、useActionData核心用途
处理表单提交结果:获取表单提交后服务器返回的数据(例如验证错误、成功消息等)。
动态反馈用户:根据 action 返回的数据更新 UI(如显示错误提示)。
简化数据流:无需手动管理状态,直接通过路由 action 获取数据。
三、useActionData基本流程
用户提交表单(通过 <Form>
组件)。
路由的 action
函数处理提交数据(例如发送到服务器)。
action
返回数据(如错误对象、成功状态)。
组件通过 useActionData()
获取该数据并渲染反馈。
四 useActionData示例:用户登录表单
4.1、 定义路由配置(使用 createBrowserRouter)
// src/main.jsx
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import LoginPage, { loginAction } from "./LoginPage";const router = createBrowserRouter([{path: "/login",element: <LoginPage />,action: loginAction, // 处理表单提交的 action 函数},
]);ReactDOM.createRoot(document.getElementById("root")).render(<RouterProvider router={router} />
);
4.2、 定义 Action 函数(处理表单提交)
// src/LoginPage.jsx
export async function loginAction({ request }) {const formData = await request.formData();const email = formData.get("email");const password = formData.get("password");// 简单的前端验证if (!email.includes("@")) {return { error: "邮箱格式不正确" };}try {// 模拟发送登录请求到服务器const response = await fetch("/api/login", {method: "POST",body: JSON.stringify({ email, password }),});const result = await response.json();if (result.success) {// 登录成功,重定向到主页return redirect("/");} else {// 返回服务器错误return { error: result.message };}} catch (err) {// 网络错误处理return { error: "网络请求失败,请重试" };}
}
4.3、 在组件中使用 useActionData
// src/LoginPage.jsx
import { Form, useActionData } from "react-router-dom";export default function LoginPage() {const actionData = useActionData(); // 获取 action 返回的数据return (<div><h1>用户登录</h1><Form method="post">{/* 显示错误信息 */}{actionData?.error && (<div style={{ color: "red" }}>{actionData.error}</div>)}<inputtype="email"name="email"placeholder="邮箱"required/><inputtype="password"name="password"placeholder="密码"required/><button type="submit">登录</button></Form></div>);
}
五、参数与返回值
参数:无。
返回值:
最近一次路由 action 函数
返回的数据。
如果没有提交过 action 或 action
未返回数据,则返回 undefined。
六、注意事项
6.1、必须与 组件配合使用
useActionData
依赖于 React Router 的 <Form>
触发的 action 提交。如果使用普通 <form>
或手动提交,数据将无法被捕获。
6.2、数据类型一致性
Action
函数可以返回任意类型的数据(对象、字符串等),但组件中需根据实际返回类型处理渲染逻辑。
6.3、作用范围
数据仅与当前路由的 action
关联。如果跳转到其他路由,useActionData 会重置。
6.5、异步处理
Action
函数可以是异步的(如示例中的 async/await
),但需确保正确处理加载状态(可配合 useNavigation
显示加载提示)。
七、高级用法:配合 useNavigation 处理加载状态
import { useActionData, useNavigation, Form } from "react-router-dom";function LoginPage() {const actionData = useActionData();const navigation = useNavigation();// 表单正在提交时显示加载状态const isSubmitting = navigation.state === "submitting";return (<Form method="post">{/* 错误提示 */}{actionData?.error && <div className="error">{actionData.error}</div>}<input name="email" /><input name="password" type="password" /><button type="submit" disabled={isSubmitting}>{isSubmitting ? "登录中..." : "登录"}</button></Form>);
}
八、与 useLoaderData 的区别
useActionData: 获取表单提交后的响应数据 表单提交(POST/PUT/DELETE)触发
useLoaderData: 获取路由初始化时的数据 页面加载或跳转(GET)触发
九、常见场景
9.1、表单验证错误
Action 中校验数据格式,返回错误信息,前端直接渲染。
9.2、API 错误处理
捕获网络请求异常,返回统一错误提示。
9.3、操作成功反馈
返回成功状态并在页面显示“操作成功”提示。
useActionData是 React Router 提供了一种声明式的方式处理表单提交与反馈,用于简化了数据流管理。
相关文章:
React 第四十一节Router 中 useActionData 使用方法案例以及注意事项
一、useActionData前言 useActionData 是 React Router 提供的一个钩子函数,用于获取在路由的 action 函数中返回的数据。它通常与表单提交(通过 <Form> 组件)配合使用,用于处理表单提交后的服务器响应数据(如错…...
西门子 Teamcenter13 Eclipse RCP 开发 1 工具栏
西门子 Teamcenter13 Eclipse RCP 开发 1 工具栏 1 配置文件2 插件控制3 命令框架 1 配置文件 在 Teamcenter 13 Eclipse RCP 开发中,plugin.xml 是插件的核心配置文件,定义了插件的: 1、唯一身份(ID、版本)。 2、所…...
【python实用小脚本-63】每天花费2小时修复黑白照片,Python一键转换,节省90%时间(建议收藏)
一、应用场景故事 上周,我的朋友小李从家里翻出了一堆老照片,这些照片大多是彩色的,但他想把它们转换成黑白风格,让照片更有复古感。他尝试用Photoshop一张张处理,但花了整整一个周末,才处理了不到一半的照…...
R语言的专业网站top5推荐
李升伟 以下是学习R语言的五个顶级专业网站推荐,涵盖教程、社区、资源库和最新动态: 1.R项目官网 (r-project.org) R语言的官方网站,提供软件下载、文档、手册和常见问题解答。特别适合初学者和高级用户,是获取R语言核心资源的…...
Apache JMeter API 接口压测技术指南
文章目录 前言技术积累JMeter 简介适用场景JMeter 核心组件 安装与配置线程组压测逐步加压压测安装相应jmeter 插件创建测试计划生成压测HTML 总结 前言 Apache JMeter 是一款开源的性能测试工具,主要用于对 Web 应用、API 接口、数据库等进行负载和压力测试。本指…...
【Java实战】IO流(转换流,打印流,数据流,序列化流)
引出问题 不同编码读取出现的乱码问题 如果是代码编码被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码; 如果不一致,使用字符流读取文本文件就会出现乱码。 public class BufferedReader{ public static void main(S…...
Python课程及开源项目推荐
Python课程及开源项目推荐 摘要:学习 Python 是一个非常好的选择,因为它是一种功能强大且易于上手的编程语言,广泛应用于数据分析、数据可视化、机器学习、网络爬虫等领域。以下是针对 Coursera 上 Python 课程和专业证书的推荐,以…...
内网互通原则详解!
目录 前言1. 路由 (Routing): 谁去哪儿找谁?🗺️2. 防火墙与安全组 (Firewalls & Security Groups): 门卫大爷和保安系统!👮♂️🚪3. 内网 DNS (Internal DNS): 小区的通讯录/电话本!📒&a…...
[Harmony]大文件持久化
1.添加权限 在module.json5文件中添加权限 "requestPermissions": [{"name": "ohos.permission.READ_WRITE_USER_FILE", // 读写用户数据"reason": "$string:read_write_user_file_reason","usedScene": {"…...
C 语言实战:使用二维数组进行学生成绩统计与分析
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 在处理表格型数据时,二维数组是 C 语言中一种非常直观且强大的工具。学生成绩单就是一个典型的二维数据:每一行代表一个学生,每一列代表一门科目。本文将通过一个具体的案例,演示如何利用二维数组来存…...
[学习]RTKLib详解:tle.c(系列终章)
本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解:pntpos.c与postpos.c [学习]RTKLib详解&…...
体重秤出口日本的计量认证介绍,体脂秤出口日本“正”认证介绍
什么是家庭专用测量仪器? 家庭专用测量仪器是一种非自动秤,主要用于普通消费者的日常生活,并且刻度为10 mg或更大,并且秤号的刻度为100或更大,满足以下条件的: 通用秤 是一种非自动秤,重量超过…...
【hadoop】Flume的相关介绍
1 概述 Flume是Cloudera开发的一个分布式的、可靠的、高可用的系统,它能够将不同数据源的海量日志数据进行高效收集、聚合、移动,最后存储到一个中心化的数据存储系统中。随着互联网的发展,特别是移动互联网的兴起,产生了海量的用…...
图片、音频、视频都能转?简鹿格式工厂了解一下
我们每天都会接触到各种各样的音视频和图片文件。无论是拍摄的照片、录制的视频,还是下载的音频资源,它们往往以不同的格式存在——有些适合分享,有些适合编辑,而有些则仅限特定设备或平台使用。格式不统一的问题,正在…...
doris节点数量规划
1.FE 节点数量 FE 节点主要负责用户请求的接入、查询解析规划、元数据管理及节点管理等工作。 对于生产集群,一般建议部署至少 3 个节点的 FE 以实现高可用环境。FE 节点分为以下两种角色: Follower 节点:参与选举操作,…...
Android Studio中Gradle 7.0上下项目配置及镜像修改
最近在打包一个测试项目的时候,使用的android studio版本比较老,后来升级到2024发现了一些小问题。可能对于安卓程序员来说,司空见惯,但对我这样的安卓小白,可把我折腾了半天。现在记录下来,供比我还小白的…...
Android Studio中Gradle中Task列表显示不全解决方案
问题现象 解决方案 File -> Settings -> Experimental ->勾选Configure all Gradle tasks during Gradle Sync(this can make Gradle Sync slower) 参考文章 Android执行build-gradle中的任务Task...
OneNote内容太多插入标记卡死的解决办法
OneNote内容太多插入标记卡死的解决办法 针对平板电脑的OneNote用户适合此类情况: 当向电脑导入几百页pdf可以正常使用,唯独插入标记的时候OneNote直接罢工,只能关闭。关闭时还可能会出现0x000000fxxxxx的错误。 注:仅对于平板…...
vue3:十三、分类管理-表格--行内按钮---行删除、批量删除实现功能实现
一、实现效果 增加行内按钮的样式效果,并且可以根绝父组件决定是否显示 增加行内删除功能、批量删除功能 二、增加行内按钮样式 1、增加视图层按钮 由于多个表格都含有按钮功能,所以这里直接在子组件中加入插槽按钮 首先增加表格行<el-table-column></el-table-…...
Python类的力量:第五篇:魔法方法与协议——让类拥有Python的“超能力”
文章目录 前言:从“普通对象”到“Python原生公民”的进化之路 一、魔法方法:赋予对象“超能力”的基因1. 构造与析构:对象生命周期的“魔法开关”2. 字符串表示:对象的“自我介绍”3. 运算符重载:让对象支持“数学魔法…...
R S的EMI接收机面板
图片摘自R & S官网。 根据您提供的第一张图(设备前面板带屏幕的图像),这是 Rohde & Schwarz ESRP7 EMI Test Receiver 的正面显示界面,我将对屏幕上显示的参数逐项进行解读: 🖥️ 屏幕参数解读 左…...
pytorch nn.RNN demo
之前已经讲过关于RNNCell的实现了. 这里用LLM写了一个简单的nn.RNN demo: import torch import torch.nn as nn# 设置随机种子以便结果可复现 torch.manual_seed(42)# 定义模型参数 input_size 4 # 输入特征维度 hidden_size 8 # 隐藏层维度 num_layer…...
高防服务器流量“清洗”什么意思
在当今数字化的时代,网络安全成为了备受关注的焦点。其中,高防服务器流量“清洗”这个概念,对于许多朋友来说可能还比较陌生。今天,就让我们一起来揭开它神秘的面纱。 首先,咱们得明白,高防服务器流量“清…...
Unity3D开发AI桌面精灵/宠物系列 【六】 人物模型 语音口型同步 LipSync 、梅尔频谱MFCC技术、支持中英文自定义编辑- 基于 C# 语言开发
Unity3D开发AI桌面精灵/宠物系列 【六】 人物模型 语音口型同步 LipSync 、梅尔频谱MFCC技术 C# 语言开发 该系列主要介绍怎么制作AI桌面宠物的流程,我会从项目开始创建初期到最终可以和AI宠物进行交互为止,项目已经开发完成,我会仔细梳理一下…...
Java详解LeetCode 热题 100(17):LeetCode 41. 缺失的第一个正数(First Missing Positive)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:排序法(不满足题目要求)3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 不足之处 4. 解法二:哈希表法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 不足之处 5. 解…...
Kafka消息路由分区机制深度解析:架构设计与实现原理
一、消息路由系统的核心架构哲学 1.1 分布式系统的三元悖论 在分布式消息系统的设计过程中,架构师需要平衡三个核心诉求:数据一致性、系统可用性和分区容忍性。Kafka的分区路由机制本质上是对CAP定理的实践解: 一致性维度:通过…...
用C语言实现了——一个基于顺序表的插入排序演示系统
一、知识要点、 插入排序是一种简单直观的排序算法,它的工作方式类似于我们整理扑克牌。 基本原理: 插入排序通过构建有序序列来工作。它每次从无序序列中取出一个元素,然后将其插入到已排序序列的适当位置。这个过程重复进行,…...
linux libdbus使用案例
以下是一个基于 Linux libdbus 的详细指南,包含服务端和客户端的完整代码示例,涵盖 方法调用、信号发送 和 异步消息处理。libdbus 是 D-Bus 的底层 C 库,直接操作 D-Bus 协议,适合需要精细控制的场景。 1. libdbus 的核心机制 连接管理:通过 dbus_bus_get 连接系统总线或…...
Apple Vision Pro空间视频创作革命:从180度叙事到沉浸式语法的重构——《Adventure》系列幕后技术深度解析
🌌 引言:沉浸式媒体的“语法实验室” Apple Vision Pro的推出标志着空间计算时代的到来,而《Adventure》系列作为其原生内容标杆,正在成为沉浸式叙事的“语法实验室”。导演Charlotte Mikkelborg与播客主持人Kent Bye的对话揭示了这一领域的技术突破、创作挑战与行业生态…...
[特殊字符] 苍穹外卖项目中的 WebSocket 实战:实现来单与催单提醒功能
🚀 苍穹外卖项目中的 WebSocket 实战:实现来单与催单提醒功能 在现代 Web 应用中,实时通信成为提升用户体验的关键技术之一。WebSocket 作为一种在单个 TCP 连接上进行全双工通信的协议,被广泛应用于需要实时数据交换的场景&#…...
【C/C++】深度解析C++ Allocator:优化内存管理的关键
文章目录 深度解析C Allocator:优化内存管理的关键1 默认 std::allocator2 自定义 Allocator3 自定义 Allocator 的实现3.1 基本结构3.2 使用自定义 Allocator 4 关键特性详解4.1 rebind 机制4.2 状态化 Allocator 5 应用示例:内存池 Allocator5.1 简单内…...
gitlab+portainer 实现Ruoyi Vue前端CI/CD
1. 场景 最近整了一个Ruoyi Vue 项目,需要实现CICD,经过一番坎坷,最终达成,现将技术要点和踩坑呈现。 具体操作流程和后端大同小异,后端操作参考连接如下: https://blog.csdn.net/leinminna/article/detai…...
CAPL编程系列_04
1_ 测试模块TestModule:基本使用 1)在Simulation Setup 中创建并配置 Test Module节点 2)编写测试脚本 【1】测试用例函数(testcase):实现具体测试逻辑 【2】主测试函数(Main Test)&…...
Weblogic SSRF漏洞复现(CVE-2014-4210)【vulhub靶场】
漏洞概述: Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。 漏洞形成原因: WebLogic Server 的 UDDI 组件(uddiexplorer.war)中的 SearchPublicR…...
科技的成就(六十八)
623、杰文斯悖论 杰文斯悖论是1865年经济学家威廉斯坦利杰文斯提出的一悖论:当技术进步提高了效率,资源消耗不仅没有减少,反而激增。例如,瓦特改良的蒸汽机让煤炭燃烧更加高效,但结果却是煤炭需求飙升。 624、代码混…...
知从科技闪耀2025上海车展:以创新驱动未来出行新篇章
上海,2025年4月23日——全球汽车科技领域的年度盛会——2025上海国际汽车工业展览会(简称“上海车展”)于5月2日圆满落幕。作为智能汽车软件与系统解决方案的领军企业,知从科技受邀参展,并在活动期间全方位展示了其在智…...
【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error
Dopamine越狱 iPhone X iOS 16.6 (20G75) Dopamine兼容设备 参考:https://www.bilibili.com/opus/977469285985157129 A9 - A11(iPhone6s-X):iOS15.0-16.6.1 A12-A14(iPhoneXR-12PM…...
医疗数据迁移质量与效率的深度研究:三维六阶框架与实践创新
引言 随着医疗信息化建设的深入推进,医疗数据作为医疗机构的核心资产,其价值与日俱增。在医院信息系统升级、迁移或整合过程中,数据迁移的质量与效率直接关系到医疗服务的连续性、患者信息的安全性以及医院运营的稳定性。传统数据迁移方法往往面临时间长、风险高、成本大等…...
[6-8] 编码器接口测速 江协科技学习笔记(7个知识点)
1 2 在STM32微控制器的定时器模块中,CNT通常指的是定时器的计数器值。以下是CNT是什么以及它的用途: 是什么: • CNT:代表定时器的当前计数值。在STM32中,定时器从0开始计数,直到达到预设的自动重装载值&am…...
java类加载阶段与双亲委派机制
java执行过程:.java->.class->然后被jvm加载解释执行。 一、类加载机制的三个阶段 加载(Loading) 任务:通过类的全限定名获取二进制字节流(如从文件系统、网络等),将字节流转换为方…...
医院网络安全托管服务(MSS)深度解读与实践路径
医疗行业网络安全挑战与MSS的应运而生 医疗行业在数智化转型的过程中面临着前所未有的网络安全挑战。根据2025年的最新数据,医疗行业将面临大量网络攻击,其中高达91%与勒索软件有关,且45%的数据泄露事件源于第三方供应商。医疗机构的平均数据…...
计算图存储采用矩阵吗,和张量关系
计算图存储采用矩阵吗,和张量关系 计算图的存储方式与张量的关系 一、计算图的存储方式 计算图(Computational Graph)是一种用于描述数学运算的有向无环图(DAG),其节点代表运算(如加减乘除、矩阵乘法、激活函数等),边代表运算的输入和输出(通常是张量)。计算图的…...
RPA 自动化实现自动发布
📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…...
博途软件直接寻址AMS348i读取位置值详解
一、AMS348i简介 AMS348i是一种高性能绝对值编码器,常用于工业自动化领域的位置检测。它具有以下特点: 高精度位置测量 多种通信接口(如SSI、PROFIBUS、PROFINET等) 坚固的工业设计 支持多种安装方式 二、元器件及配件 设备…...
MySQL 学习(十)执行一条查询语句的内部执行过程、MySQL分层
目录 一、MySQL 执行流程图二、MySQL的分层2.1 连接阶段2.2 查询缓存阶段(Query Cache,MySQL 8.0已移除)2.3 解析与预处理阶段(词法分析、语法分析、预处理器)2.4 查询优化阶段2.5 执行引擎阶段 三、常见面试题3.1 MyS…...
C语言中的指定初始化器
什么是指定初始化器? C99标准引入了一种更灵活、直观的初始化语法——指定初始化器(designated initializer), 可以在初始化列表中直接引用结构体或联合体成员名称的语法。通过这种方式,我们可以跳过某些不需要初始化的成员,并且可以以任意顺序对特定成员进行初始化。这…...
什么是 NB-IoT ?窄带IoT 应用
物联网使各种应用能够与大量无线通信设备进行连接和通信。它有望为智能城市、公用事业、制造设施、农业应用、远程工业机械等提供动力。这些应用均可使用窄带物联网(NB-IoT )网络协议。 例如,智能城市可使用 NB-IoT 监控整个城市的街道照明、…...
CSRF 和 XSS 攻击分析与防范
CSRF 和 XSS 攻击分析与防范 CSRF (跨站请求伪造) 什么是 CSRF? CSRF (Cross-Site Request Forgery) 是一种攻击方式,攻击者诱使用户在已登录目标网站的情况下,执行非预期的操作。 攻击流程: 用户登录可信网站 A在不登出 A 的…...
Window下Jmeter多机压测方法
1.概述 Jmeter多机压测的原理,是通过单个jmeter客户端,控制多个远程的jmeter服务器,使他们同步的对服务器进行压力测试。 以此方式收集测试数据的好处在于: 保存测试采样数据到本地机器通过单台机器管理多个jmeter执行引擎测试…...
Apache RocketMQ ACL 2.0 全新升级
📖知识延伸:本文相关知识库已收录至「RocketMQ 中文社区」,同步更新更多进阶内容 引言 RocketMQ 作为一款流行的分布式消息中间件,被广泛应用于各种大型分布式系统和微服务中,承担着异步通信、系统解耦、削峰填谷和消…...