回到笔记开发UINext.jsReact Hook Form 与 shadcn/ui 表单排错避免嵌套 form 带来的冒泡提交,并在保存成功后正确重置 React Hook Form 的 isDirty 状态。 2024年12月17日 1 分钟阅读收听本文 Microsoft Edge 神经语音shadcn/ui 的 Form 组件建立在 React Hook Form 之上。遇到提交行为异常时,优先检查原生 <form> 结构和 React Hook Form 的状态生命周期。 避免嵌套 <form> HTML 不允许表单嵌套。子组件需要保存局部数据时,最好只保留一个外层 <form>,把按钮改成 type="button",再显式调用对应逻辑。 如果历史结构暂时无法拆开,可以在子表单入口阻止事件继续传播: const onSubmit = (event: React.FormEvent<HTMLFormElement>) => { event.preventDefault() event.stopPropagation() void form.handleSubmit(onSuccess, onError)(event) } 这只能作为过渡方案。长期仍建议把嵌套表单重构为一个表单或彼此独立的两个表单。 提交成功后重置 isDirty 保存成功并不会自动告诉 React Hook Form“当前值已经成为新的初始值”。如果希望保留界面上的值,同时清除 dirty 状态,可以执行: form.reset(form.getValues()) 如果只想保留值,也可以使用: form.reset({}, { keepValues: true }) 前一种写法会明确把当前值设为新的默认值,后续判断 isDirty 时通常更直观。 交流留下你的想法评论由 GitHub Issues 托管,中英文页面共享同一段讨论。正在载入评论…
shadcn/ui 的 Form 组件建立在 React Hook Form 之上。遇到提交行为异常时,优先检查原生
<form>结构和 React Hook Form 的状态生命周期。避免嵌套
<form>HTML 不允许表单嵌套。子组件需要保存局部数据时,最好只保留一个外层
<form>,把按钮改成type="button",再显式调用对应逻辑。如果历史结构暂时无法拆开,可以在子表单入口阻止事件继续传播:
这只能作为过渡方案。长期仍建议把嵌套表单重构为一个表单或彼此独立的两个表单。
提交成功后重置
isDirty保存成功并不会自动告诉 React Hook Form“当前值已经成为新的初始值”。如果希望保留界面上的值,同时清除 dirty 状态,可以执行:
如果只想保留值,也可以使用:
前一种写法会明确把当前值设为新的默认值,后续判断
isDirty时通常更直观。