useActionState 阻止表单重置

news/2025/11/12 20:36:37/文章来源:https://www.cnblogs.com/dingshaohua/p/19215332

前言

useActionState是react19新出的api,提供的非受控表单钩子。
但是他有一个缺点,就是每次提交表单后会重置表单状态!

官方美其名曰“遵守原生表现”,但是网上讨伐声音,就足以证明垃圾!
https://github.com/facebook/react/issues/29034
https://github.com/facebook/react/issues/30580

方式1(推荐)

定义重写全局的 form reset,新建 preventGlobalFormReset.ts

/*** 全局 Patch HTMLFormElement.prototype.reset 方法* 阻止 React 19 useActionState 自动重置表单* 参考: https://github.com/facebook/react/issues/29034** 使用方法:在应用入口调用一次 patchFormReset()** 控制选项:* - 默认:阻止所有表单重置* - <form data-allow-reset>:允许该表单重置* - <form data-prevent-reset>:明确阻止该表单重置* - formRef.current.reset(true):手动调用时传入 true 强制重置*/// 保存原始方法的引用
let originalReset: typeof HTMLFormElement.prototype.reset | null = null;export function patchFormReset(options?: {/** 默认行为:'prevent' 阻止重置 | 'allow' 允许重置 */defaultBehavior?: 'prevent' | 'allow';
}) {if (typeof window === 'undefined') return;if (originalReset) {console.warn('[patchFormReset] 已经 patch 过了,跳过');return;}const { defaultBehavior = 'prevent' } = options || {};// 保存原始的 reset 方法originalReset = HTMLFormElement.prototype.reset;// 重写 reset 方法,支持传入参数强制重置HTMLFormElement.prototype.reset = function (this: HTMLFormElement, force?: boolean) {// 如果传入 true,强制重置if (force === true) {originalReset!.call(this);return;}// 检查表单上的属性const hasAllowReset = this.hasAttribute('data-allow-reset');const hasPreventReset = this.hasAttribute('data-prevent-reset');let shouldReset = defaultBehavior === 'allow';// 属性优先级高于默认行为if (hasAllowReset) {shouldReset = true;} else if (hasPreventReset) {shouldReset = false;}if (shouldReset) {originalReset!.call(this);} else {// 什么都不做,阻止重置}};
}/*** 恢复原始的 reset 方法*/
export function unpatchFormReset() {if (typeof window === 'undefined') return;if (!originalReset) {console.warn('[unpatchFormReset] 没有找到原始的 reset 方法');return;}HTMLFormElement.prototype.reset = originalReset;originalReset = null;console.log('[unpatchFormReset] HTMLFormElement.prototype.reset 已恢复');
}

在 main.ts 调用即可

// 全局阻止 React 19 useActionState 自动重置表单
patchFormReset({defaultBehavior: 'prevent', // 默认阻止重置
});

在组件中,如果想要手动调用重置,仍然可以,只不过加一个强制即可!

formRef.current.reset(true);

方式 2

如果你不想污染全局,可以这么做
订一个一个 hook,usePreventFormReset.ts

import { useEffect, useRef } from 'react';/*** 阻止 React 19 useActionState 自动重置表单* 参考: https://github.com/facebook/react/issues/29034#issuecomment-2843233452*/
export function usePreventFormReset() {const formRef = useRef<HTMLFormElement>(null);useEffect(() => {const watchReset = (e: Event) => e.preventDefault();formRef.current?.addEventListener('reset', watchReset);return () => formRef.current?.removeEventListener('reset', watchReset);}, []);return formRef;
}

然后组件内使用即可

// 阻止表单重置
const formRef = usePreventFormReset();<form action={formAction} ref={formRef}>
// ***
</form>

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

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

相关文章

路由基础

1. 路由获取方式1. 直连路由。由设备自动生成指向本地直连网络 2. 静态路由。由网络管理员手工配置的路由条目 3. 动态路由。路由器运行动态路由协议学习到的路由动态路由使用最多的协议 ospf isis2. 路由选择1. 最长掩…

UltraSearch(文件搜索神器) Pro v4.8.5.1185 多语便携版

简介 UltraSearch一款超快的文件搜索软件,数秒就可以在硬盘中帮您搜索出文件,比系统自带的快N倍。UltraSearch并不是通过建立索引或后台处理,它是通过查看NTFS分区的主文件表(MFT)来快速找到文件。类似的快速搜索…

idea链接database时报错:serverTimezone

1.报错:Server returns invalid timezone. Go to Advanced tab and set serverTimezone property manually. 2.设置时区 jdbc:mysql://localhost:3306/zcck?serverTimezone=UTC

题解:CF2117F Wildflower

树上计数,洛谷标签里有 Ad-hoc,其实我觉的没那么难,可能因为我太菜了只能做绿题的原因。CF2117F Wildflower 更洛谷的阅读体验 好题,爽! 思维题,爽! Ad-hoc,爽! 我做出来了,爽飞了! 思路 首先我们发现由于每…

UVM环境自动生成器具(2)uvmdvgen

UVM环境自动生成器具(2)uvmdvgenpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

题解:CF961C Chessboard

洛谷。 题目传送门。 某次校内模拟赛的 T1。 分析 注意到 \(n\le100\),显然这是一道搜索题。考虑怎么来搜。 我们发现,四块小棋盘可以在左上、右上、左下、右下任意排列,那么构成大棋盘的总方案数就是 \(4!=24\) 种…

7年java开发的一些感悟

下面是对你原文的润色和扩写版本,保持你真实的口吻,但更有层次、情绪和故事感,也让读者更容易共鸣:很难想象,我已经在 Java 这行干了 7 年了。 今年快 35 岁,前段时间刚换了一家公司,总算不用再为生活焦虑得睡不…

11.12 NOIP模拟6/多校1 改题记录

......HZOJ 写在前面 NOIP AK me. 全是唐题。如此模拟赛,何以NOIP?大概就是所有时间拿去攻T1了吧。然后暴力也懒得打了。《Blueming》 ‘뭐해?‘라는 두 글자에 在干嘛?这几个字中 ‘네가 보고 싶어’ 나의 속마음…

文字识别系统代码

点击查看代码 import torch from torch import optim import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable from torchvision import datasets, transforms from torch.utils…

B4093 [CSP-X2021 山东] 发送快递

B4093 [CSP-X2021 山东] 发送快递 题解题目传送门 我的博客 - 欢迎光临! 本题弱化版(?):P3052,P10483 二者互为双倍经验。首先对于一个强制捆绑组里的物品,我们直接使用并查集,将一个并查集里的物品合成为一个…

从零上手 Rokid JSAR:打造专属 AR 桌面交互式 3D魔方,开启空间创建之旅

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

微软2025年11月补丁星期二修复1个零日漏洞和63个安全漏洞

微软2025年11月补丁星期二发布了安全更新,修复了63个安全漏洞,其中包括1个被积极利用的零日漏洞。本次更新包含4个严重级别漏洞,涉及权限提升、远程代码执行等多个安全领域。微软2025年11月补丁星期二修复1个零日漏…

CF468C Hack it!

已严肃完成今日构造大学习。 首先扔出来一个 \([1, 10^{18} - 1]\) 区间,你会发现这个区间每往右平移一个单位那么 \(f\) 的和就会加 \(1\),当然得在 \(2 \times 10^{18} - 1\) 之内,这也是我们选择这个界的原因。 …

深入解析:FT62FC3X 8位MCU单片机选型表,详细解析FT62FC31A/32A/33A/35A/3FA

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

FFmpeg for Android 图传Web

FFmpeg for Android & 图传Web 之前在项目研发中有个需求, 需要对接RTSP摄像头, 并且需要将其转封装格式到H5能够播放的格式, 并且需要在纯安卓APP中实现, 并且需要低延迟. 找了一圈都没有合适的且现成的方案, 这个…

语法记录

\(\texttt{titile}\) 计概与数算行末不要空格!!! 字符串与字符数组读入 cin >> str //字符与字符串,不含空格、制表符与换行 scanf("%c", &ch) //读单个字符 ch scanf(" %c", &…

Can Large Language Models Detect Rumors on Social Media?

论文信息论文标题:Can Large Language Models Detect Rumors on Social Media?论文作者:刘强、陶翔、吴俊飞、吴舒、王亮论文来源:发布时间:2024-02-06论文地址:link论文代码:link1 介绍 1.1 研究动机研究动机围…

压迫

从明天开始到考研结束前 拒绝三角洲 方舟想起来了挂一下,没想起来就算了 抖音不再打开 b站用来看课 每天总结反思 多学多想多思考 提高效率 瞄着最高分努力 看看实力 如果考的太高完全可以选择二战,这也是二战得信心…

P13573 [CCPC 2024 重庆站] Pico Park

P13573 [CCPC 2024 重庆站] Pico Park 题意: 游戏中,有 \(n\le 500\) 名玩家,依次站在数轴的 \(1,2,3, \dots, n\) 处,第 \(i\) 名玩家有一个面向的方向 \(d_i\),为向左或向右。 每名玩家手里有一把缩小枪,玩家会…

手工安装gcc-13.3.0

手工安装gcc-13.3.0wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.2.1.tar.bz2wget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-4.1.0.tar.bzwget https://gcc.gnu.org/pub/gcc/infrastructure/mpc-1…