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

useActionState 阻止表单重置

前言

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.zskr.cn/news/47861.html

相关文章:

  • 部署MQTT Broker - Mosquitto - -YADA
  • 7年java开发的一些感悟
  • 11.12 NOIP模拟6/多校1 改题记录
  • FFmpeg for Android 图传Web
  • 语法记录
  • Win7 隐藏文件夹盘符
  • DotNetGuide 突破了 9.5K + Star,一份全面的C#/.NET/.NET Core学习、工作、面试指南知识库!
  • 在ec2上部署qwen3-VL-2B模型
  • 【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
  • 软件工程学习日志2025.11.12
  • NLTK库用法示例:Python自然语言处理入门到实践 - 实践
  • 2025人形机器人产业链全景分析报告:核心技术与市场趋势|附130+份报告PDF、数据、可视化模板汇总下载
  • 2025履带式/机场/智能驱鸟机器人系统推荐榜:申昊科技以AI赋能,破解多场景鸟害难题
  • 2025室外/攀爬/绳网/公园/景区/户外游乐设施企业口碑榜:全场景覆盖 + 实力出圈,这4家企业成采购优选
  • 2025年邦顿商用空气能厂家新实力榜:聚焦邦顿商用变频/商用变频冷暖/商用变频热泵/模块化应用优势!
  • 实用指南:OmniSteward:LLM Agent 赋能,语音文字随心控,智能家居与电脑的超级管家
  • 例子:vue3+vite+router创建多级导航菜单,菜单收缩展开优化
  • CF1984F Reconstruction
  • IDM超详细安装下载教程,一次安装免费使用 Internet Download Manager
  • 详细介绍:微信小程序开发实战指南(三)-- Webview访问总结
  • flask: 用flask-cors解决跨域问题
  • Linux小课堂: 用户管理与权限控制机制详解 - 实践
  • 分享一个MySQL万能备份脚本
  • 解码LVGL 布局与多界面编程
  • FreeSql自动分表
  • SAP SQL 加法不生效问题
  • 2025-11-12 早报新闻
  • linux版本微信打开关闭快捷键
  • Linux《网络基础》 - 教程
  • 如何构建可信智能 Data Agent?推荐 Aloudata Agent 分析决策智能体