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> 组件)配合使用,用于处理表单提交后的服务器响应数据(如错…...

C++多态实现的必要条件剖析
在C中,多态的一个必要条件确实是通过基类的指针或引用调用虚函数。这一要求背后的原因与C如何实现动态绑定(运行时多态)密切相关。下面详细解释了为什么需要使用基类的指针或引用来实现多态。 动态绑定与静态绑定 静态绑定(编译期…...

C语言_自动义类型:联合和枚举
1. 联合体 1.1 联合体类型的声明 与结构体相似,联合体也是有一个或多个成员(可以是不同类型)构成;但是编译器只为最大的成员分配足够的内存空间 联合体的特点是所有成员共用同一块内存空间,所以联合体也叫ÿ…...

汽车紧固件涂层18问:看敦普无铬锌铝涂料如何为螺丝防锈防腐
导读 在汽车紧固件防锈涂装领域,敦普牌紧固件无铬锌铝涂料,是专为汽车紧固件打造的水性涂料,集防锈、环保、高性价比于一体。它有何独特之处?让我们一探究竟。 1、敦普紧固件无铬锌铝涂料是什么产品? 敦普紧固件无铬…...

掘金中亚货代蓝海,易境通货代系统解锁数字化制胜密码!
2025年,中亚地区正成为全球物流行业的新蓝海。中亚五国因其独特的地缘位置和“一带一路”倡议的深化推进,正逐渐成为全球物流行业的战略要地。 在政策红利、基建升级与市场需求的叠加效应下,中亚物流市场预计在2025年迎来爆发式增长。但传统…...
Python内存管理:赋值、浅拷贝与深拷贝解析
赋值与共享资源 在Python中,直接赋值操作(如 list2 list1)会导致两个变量共享同一个内存地址。这意味着对 list1 的修改会直接影响到 list2,因为它们指向同一个对象。 注意: 赋值等于完全共享资源 如果我们不希望这样完全共享&…...

W1R3S: 1.0.1靶场
W1R3S: 1.0.1 来自 <W1R3S: 1.0.1 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.249 3,对靶机进行端口…...
深度学习-分布式训练机制
1、分布式训练时,包括train.py的全部的代码都会在每个gpu上运行吗? 在分布式训练(如使用 PyTorch 的 DistributedDataParallel,DDP)时,每个 GPU 上运行的进程会执行 train.py 的全部代码,但通过…...

[Mamba轻量化]DefMamba: Deformable Visual State Space Model,CVPR2025
paper 文章目录 AbstractMethod整体模型架构可变形状态空间模型 Experiments Abstract 然而,大多数现有的视觉Mamba方法使用预定义的扫描顺序将图像展平为1D序列,导致模型在特征提取过程中对图像空间结构信息的利用能力减弱。为解决这一问题࿰…...
CSRF 和 XSS 攻击分析与防范
CSRF 和 XSS 攻击分析与防范 CSRF (跨站请求伪造) 什么是 CSRF? CSRF (Cross-Site Request Forgery) 是一种攻击方式,攻击者诱使用户在已登录目标网站的情况下,执行非预期的操作。 攻击流程: 用户登录可信网站 A在不登出 A 的…...

找银子 题解(c++)
题目 思路 首先,这道题乍一看,应该可以用搜索来做。 但是,搜索会不会超时间限制呢? 为了防止时间超限,我们可以换一种做法。 先创立两个二维数组,一个是输入的数组a,一个是数组b。 假设 i 行 j 列的数…...
中国版 Cursor?腾讯推出 AI 编程助手 CodeBuddy,重新定义编程体验
人工智能(AI)技术的迅猛发展正深刻地变革着各个行业,编程领域也不例外。以原生 IDE 体验见长的 Cursor,凭借其 Agent 模式在 AI 编程领域脱颖而出,对 GitHub Copilot 以及 VS Code 与 JetBrains 全家桶的地位发起挑战。…...

JVM学习专题(二)内存模型深度剖析
目录 1.JVM结构体系 编辑 2.跨平台特性 3.JVM整体结构及内存模型 1.栈内存 1、栈帧: 1.局部变量表 2.操作数栈 3.动态链接 4.方法出口 2、创建对象 2.程序计数器: 3.方法区 4.堆 5.本地方法区 6.总结 1.JVM结构体系 JDK、JRE 和 JVM…...

密码学实验:凯撒密码
密码学实验:凯撒密码 一、实验目的 掌握凯撒密码的数学原理:理解字符移位与模运算的结合,实现加解密算法。理解暴力破解本质:通过穷举有限密钥空间,掌握利用语言特征破解密文的方法。编程实践:用Python实…...
linux备份与同步工具rsync
版权声明:原创作品,请勿转载! 文章目录 版权声明:原创作品,请勿转载! 实验环境介绍: 1.工具介绍 2.详细介绍 2.1 本地模式(用得少) 2.2 远程模式 2.3 守护进程模式…...
PYTHON训练营DAY26
一、函数 (一)不带参数的函数 # 定义一个简单的问候函数 def greet():"""打印一句问候语。"""message "大家好!欢迎学习Python函数定义!"print(message)greet()(二&#x…...

WPS一旦打开,就会修改默认打开方式,怎么解?
目录 前言 解决方法 结语 前言 电脑上同时存在WPS和微软的Office全家桶,但是我更喜欢用Office全家桶。前几天刚在设置改过来,忘记更改pdf文件打开默认应用。结果没过几天,不小心用WPS打开pdf文件时候,给我把默认设置全改回去了…...
从概念到可工程化智能体的转变路径——以“知识奇点工程师”为例
产品部门定义了一个如下概念性的“知识奇点工程师”,他们构建的不仅仅是一个数据库或知识图谱,而是一个活的、能自我进化的知识生态系统,是整个“Neuralink for Education”宏伟蓝图的基石。他们的工作难度和重要性,不亚于为AI引擎…...

单片机-STM32部分:12、I2C
飞书文档https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh 一、简介 IIC协议,又称I2C协议,是由PHILP公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备,IIC属于半双工同步通信方式。 IIC是一种同步…...

Payload的定义及核心概念
在IT领域,Payload(有效载荷) 指数据传输或操作中承载实际功能或信息的主体部分,与协议头、元数据等辅助内容区分。其核心特点是完成特定目标,例如传递关键数据、执行代码逻辑或实现攻击行为。 主要应用场景及技术解析 …...
idea插件使用
文章目录 在哪里安装插件常用插件 在哪里安装插件 离线下载插件请参考我的文章–>可复用性代码 在线下载 插件 :File(文件) —> Settings(设置) —> Plugins(插件) 常用插件 汉化插件:Chinese (Simplified) Language Pack /中文语言包。作者:…...

计算机网络笔记(二十四)——4.6互联网的路由选择协议
4.6.1有关路由选择协议的几个基本概念 路由选择协议是计算机网络中维护和生成路由表的核心机制。 1. 路由选择的核心目标 转发(Forwarding):路由器基于本地转发表,将分组从输入链路转移到输出链路(单台路由器的本地…...
UniApp 微信小程序绑定动态样式 :style 避坑指南
在使用 UniApp 开发跨端应用时,绑定动态样式 :style 是非常常见的操作。然而,很多开发者在编译为 微信小程序 时会遇到一个奇怪的问题: 原本在 H5 中可以正常渲染的样式,在微信小程序中却不生效! 让我们通过一个示例来…...

论文阅读与写作:《从探索到突破:解密科研和论文写作的思维密码》
文章目录 一、如何做科研1.科研的步骤2.课题选择3.快速入门一个新领域:读论文,先读综述(1)自己看论文的时候,每篇论文花3-5分钟记录一下自己的idea和一些瞬间的想法(2)高质量文献:顶会顶刊(3)如何检索 4.注重团队协作与学术交流5.…...

致远OA绩效考核管理应用【附百度网盘下载链接,官方售价8K】
产品概述 绩效考核管理预置三种考核方式:工作事务考核、关键绩效考核、360度考评,满足不同企业考核需求,从考核等级定义、考核方案设置、考核分发到员工考核,再到考核结果汇总并审批,对绩效考核全过程进行闭环管理&…...
Vue百日学习计划Day4-8——Gemini版
番茄时钟: 每个番茄钟为25分钟学习,之后休息5分钟。每完成4个番茄钟,进行一次15-30分钟的长休息。灵活性: 这仍然是一个建议性计划。某些主题(尤其是 Flexbox 和 Grid)可能需要比预期更多的时间来练习和理解…...
HarmonyOS NEXT 适配高德地图FlutterSDK实现地图展示,添加覆盖物和移动Camera
HarmonyOS NEXT 适配高德地图 Flutter SDK 实现地图展示,添加覆盖物和移动 Camera 在现代移动应用开发中,地图功能是许多应用的核心组成部分之一。HarmonyOS NEXT 提供了强大的跨平台开发能力,而高德地图 Flutter SDK 则为开发者提供了丰富的…...

DeepSeek执行流程加速指南:跨框架转换与编译优化的核心策略全解析
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
docker-compose——安装redis
文章目录 一、编写docker-compose.yaml文件二、编写redis.conf文件三、启动docker-compose 一、编写docker-compose.yaml文件 version: 3.3 services:redis:image: redis:latestcontainer_name: redisrestart: alwaysports:- 6379:6379volumes:- ./redis/data:/data- ./redis/…...

manuskript开源程序是面向作家的开源工具
一、软件介绍 文末提供程序和源码下载 manuskript开源程序是面向作家的开源工具,Manuskript 可在 GNU/Linux、Mac OS X 和 Windows 上运行。 二、Features 特征 Manuskript provides a rich environment to help writers create their first draft and then furt…...