React 第四十一节Router 中 useActionData 使用方法案例以及注意事项

news2025/5/16 7:28:06

一、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>
        )}

        <input
          type="email"
          name="email"
          placeholder="邮箱"
          required
        />
        <input
          type="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 提供了一种声明式的方式处理表单提交与反馈,用于简化了数据流管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++多态实现的必要条件剖析

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

C语言_自动义类型:联合和枚举

1. 联合体 1.1 联合体类型的声明 与结构体相似&#xff0c;联合体也是有一个或多个成员&#xff08;可以是不同类型&#xff09;构成&#xff1b;但是编译器只为最大的成员分配足够的内存空间 联合体的特点是所有成员共用同一块内存空间&#xff0c;所以联合体也叫&#xff…

汽车紧固件涂层18问:看敦普无铬锌铝涂料如何为螺丝防锈防腐

导读 在汽车紧固件防锈涂装领域&#xff0c;敦普牌紧固件无铬锌铝涂料&#xff0c;是专为汽车紧固件打造的水性涂料&#xff0c;集防锈、环保、高性价比于一体。它有何独特之处&#xff1f;让我们一探究竟。​ 1、敦普紧固件无铬锌铝涂料是什么产品&#xff1f; 敦普紧固件无铬…

掘金中亚货代蓝海,易境通货代系统解锁数字化制胜密码!

2025年&#xff0c;中亚地区正成为全球物流行业的新蓝海。中亚五国因其独特的地缘位置和“一带一路”倡议的深化推进&#xff0c;正逐渐成为全球物流行业的战略要地。 在政策红利、基建升级与市场需求的叠加效应下&#xff0c;中亚物流市场预计在2025年迎来爆发式增长。但传统…

W1R3S: 1.0.1靶场

W1R3S: 1.0.1 来自 <W1R3S: 1.0.1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.249 3&#xff0c;对靶机进行端口…

[Mamba轻量化]DefMamba: Deformable Visual State Space Model,CVPR2025

paper 文章目录 AbstractMethod整体模型架构可变形状态空间模型 Experiments Abstract 然而&#xff0c;大多数现有的视觉Mamba方法使用预定义的扫描顺序将图像展平为1D序列&#xff0c;导致模型在特征提取过程中对图像空间结构信息的利用能力减弱。为解决这一问题&#xff0…

找银子 题解(c++)

题目 思路 首先&#xff0c;这道题乍一看&#xff0c;应该可以用搜索来做。 但是&#xff0c;搜索会不会超时间限制呢&#xff1f; 为了防止时间超限,我们可以换一种做法。 先创立两个二维数组&#xff0c;一个是输入的数组a&#xff0c;一个是数组b。 假设 i 行 j 列的数…

JVM学习专题(二)内存模型深度剖析

目录 1.JVM结构体系 ​编辑 2.跨平台特性 3.JVM整体结构及内存模型 1.栈内存 1、栈帧&#xff1a; 1.局部变量表 2.操作数栈 3.动态链接 4.方法出口 2、创建对象 2.程序计数器&#xff1a; 3.方法区 ​4.堆 5.本地方法区 6.总结 1.JVM结构体系 JDK、JRE 和 JVM…

密码学实验:凯撒密码

密码学实验&#xff1a;凯撒密码 一、实验目的 掌握凯撒密码的数学原理&#xff1a;理解字符移位与模运算的结合&#xff0c;实现加解密算法。理解暴力破解本质&#xff1a;通过穷举有限密钥空间&#xff0c;掌握利用语言特征破解密文的方法。编程实践&#xff1a;用Python实…

WPS一旦打开,就会修改默认打开方式,怎么解?

目录 前言 解决方法 结语 前言 电脑上同时存在WPS和微软的Office全家桶&#xff0c;但是我更喜欢用Office全家桶。前几天刚在设置改过来&#xff0c;忘记更改pdf文件打开默认应用。结果没过几天&#xff0c;不小心用WPS打开pdf文件时候&#xff0c;给我把默认设置全改回去了…

单片机-STM32部分:12、I2C

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

Payload的定义及核心概念

在IT领域&#xff0c;Payload&#xff08;有效载荷&#xff09; 指数据传输或操作中承载实际功能或信息的主体部分&#xff0c;与协议头、元数据等辅助内容区分。其核心特点是完成特定目标&#xff0c;例如传递关键数据、执行代码逻辑或实现攻击行为。 主要应用场景及技术解析 …

计算机网络笔记(二十四)——4.6互联网的路由选择协议

4.6.1有关路由选择协议的几个基本概念 路由选择协议是计算机网络中维护和生成路由表的核心机制。 1. 路由选择的核心目标 转发&#xff08;Forwarding&#xff09;&#xff1a;路由器基于本地转发表&#xff0c;将分组从输入链路转移到输出链路&#xff08;单台路由器的本地…

论文阅读与写作:《从探索到突破:解密科研和论文写作的思维密码》

文章目录 一、如何做科研1.科研的步骤2.课题选择3.快速入门一个新领域&#xff1a;读论文&#xff0c;先读综述(1)自己看论文的时候&#xff0c;每篇论文花3-5分钟记录一下自己的idea和一些瞬间的想法(2)高质量文献&#xff1a;顶会顶刊(3)如何检索 4.注重团队协作与学术交流5.…

致远OA绩效考核管理应用【附百度网盘下载链接,官方售价8K】

产品概述 绩效考核管理预置三种考核方式&#xff1a;工作事务考核、关键绩效考核、360度考评&#xff0c;满足不同企业考核需求&#xff0c;从考核等级定义、考核方案设置、考核分发到员工考核&#xff0c;再到考核结果汇总并审批&#xff0c;对绩效考核全过程进行闭环管理&…

DeepSeek执行流程加速指南:跨框架转换与编译优化的核心策略全解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

manuskript开源程序是面向作家的开源工具

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

游戏引擎学习第281天:在房间之间为摄像机添加动画效果

回顾并为今天的内容定下基调 这次我们要继续深入处理实体系统。在前一阶段对实体系统做了一些很酷的改动&#xff0c;但现在到了要认真面对和完善它的时候。 今天的主要目标是修复并优化摄像机在房间之间移动时的逻辑。在上一次的实现中&#xff0c;我们重新启用了基于房间的…

Kaamel隐私合规洞察:Temu在韩被罚事件分析

Kaamel隐私合规与数据安全团队分析报告 韩国个人信息保护委员会&#xff08;PIPC&#xff09;对中国电子商务巨头Temu处以巨额罚款&#xff0c;原因是其严重违反了用户数据保护法律 。核心违规行为包括未经适当披露或用户同意非法跨境传输数据、未能指定当地代表、账户注销流程…

计算机视觉----基于锚点的车道线检测、从Line-CNN到CLRNet到CLRKDNet 本文所提算法Line-CNN 后续会更新以下全部算法

本文所提算法如下&#xff1a; 叙述按时间顺序 你也可以把本文当作快速阅读这几篇文献的一个途径 所有重要的部分我都已经标注并弄懂其原理 方便自己也是方便大家 Line-CNN&#xff1a;基于线提议单元的端到端交通线检测 摘要 交通线检测是一项基础且具有挑战性的任务。以往的…