【免费下载链接】formisch
The lightweight, schema-first, and fully type-safe form library for React, Solid, Vue, Svelte and more.
Formisch 是一款轻量、Schema 优先且完全类型安全的表单库,支持 React、Solid、Vue、Svelte 等多个框架。本教程带你完整掌握 Formisch 的表单提交处理:从handleSubmit的校验流程,到isSubmitting等异步提交状态的管理技巧,帮助你在 10 分钟内写出健壮、防抖、带加载态的表单提交逻辑。
Formisch 表单库的类型安全 Valibot Schema 校验/react-form-library-comparison/type-safe-issues.jpg)
handleSubmit 一分钟上手
handleSubmit是 Formisch 表单提交的核心方法:它接收一个表单 store 和一个提交处理函数,返回一个可以直接挂到表单onsubmit事件上的处理器。
一次提交会依次发生以下事情:
- 阻止默认提交——调用
event.preventDefault(),页面不会刷新,表单状态得以保留; - 记录本次提交的顺序号——防止"过期提交"干扰界面(后面会讲);
- 标记提交状态——将
isSubmitted与isSubmitting置为true; - 执行完整校验——校验失败时自动聚焦第一个出错字段;
- 校验通过才调用你的 handler——handler 拿到的是 Schema 转换后的最终输出值,类型由
SubmitHandler自动推导。
源码位置:handleSubmit.ts
import { handleSubmit, useForm } from '@formisch/react'; import * as v from 'valibot'; const schema = v.object({ email: v.pipe(v.string(), v.email()), }); const form = useForm({ schema }); const onSubmit = handleSubmit(form, async (values) => { // values.email 是类型安全的 string await fetch('/api/login', { method: 'POST', body: JSON.stringify(values), }); });💡 如果你的框架封装了
<Form>组件(如 React、Vue 的Form),也可以直接把 handler 传给onSubmit属性,效果相同。
异步提交状态三剑客:isSubmitting、isSubmitted、errors
Formisch 在提交全程自动维护三个响应式状态,无需任何手动setState:
| 状态 | 含义 | 典型用途 |
|---|---|---|
isSubmitting | 提交处理正在进行中 | 按钮显示 loading、禁用重复点击 |
isSubmitted | 表单已被提交过 | 显示"至少提交一次"的提示 |
errors | 表单根级错误信息 | 显示网络/服务端错误 |
配合isSubmitting实现标准的提交按钮加载态:
<button type="submit" disabled={form.isSubmitting}> {form.isSubmitting ? '提交中…' : '提交'} </button>errors会在 handler 抛出异常时自动填充error.message,配合简单展示即可完成服务端错误提示:
{form.errors && <p role="alert">{form.errors}</p>}状态定义见 form.ts,isSubmitting的自动重置逻辑见 handleSubmit.ts。
防抖利器:submissionId 如何避免"过期提交"
异步提交最大的坑是竞态:用户在请求发出后继续输入、或点了第二次提交,旧的响应回来却覆盖了新状态。Formisch 用内部的submissionId顺序号解决这类问题:
- 校验期间输入变化:输入变更会令当前校验作废,过期的校验结果不会写入任何错误状态;
- 校验完成但提交已过期:若已有更新的提交或
reset发生,旧 handler 根本不会被调用; - handler 结束后:只有"仍是最新一次提交"的请求才允许修改
errors和isSubmitting,防止旧请求的失败信息覆盖新提交的成功界面。
需要注意:这不会中止已经开始的网络请求,只是保证过期结果不再影响界面。这个设计在 handleSubmit.ts 中通过submissionId与validationId双重比对实现。
调用reset(form)重置表单时,同样会递增submissionId并立即清除isSubmitting,彻底丢弃挂起的旧提交,见 reset.ts。
submit:从表单外部程序化提交
当提交按钮位于表单元素之外(比如悬浮操作栏),可以用submit方法触发原生提交。它调用表单元素的requestSubmit(),因此会完整走一遍handleSubmit的校验与状态管理流程:
import { submit } from '@formisch/react'; <button type="button" onClick={() => submit(form)}> 从外部提交 </button>源码仅一行,非常优雅:submit.ts
无表单元素场景:React Native 差异
在 React Native 中不存在<form>元素和 submit 事件,handleSubmit会退化为一个普通的异步函数,直接挂到按钮的onPress上调用,且 handler 只接收校验后的输出值(没有 event 参数)。详见 API 文档说明与框架实现:handleSubmit.react-native.ts。
总结与延伸
| 场景 | 推荐方式 |
|---|---|
有<Form>/<form>包裹 | 把 handler 传给onSubmit,或直接用handleSubmit |
| 按钮在表单外部 | submit(form) |
| 需要加载态 / 防重复提交 | 读取form.isSubmitting |
| 显示服务端错误 | 读取form.errors |
| 清理挂起的提交 | reset(form) |
想深入更多细节,可以继续阅读:
handleSubmitAPI 文档:handleSubmit/index.mdx/methods/api/(methods)/handleSubmit/index.mdx)- 提交处理指南(React 版):handle-submission/index.mdx/react/guides/(main-concepts)/handle-submission/index.mdx)
- 完整示例(Svelte 发票表单):App.svelte
- 表单状态信号定义:form.ts
掌握handleSubmit与这三个状态信号,你的 Formisch 表单提交体验——加载态、错误提示、竞态防护——就都已经就位了 🚀
【免费下载链接】formisch
The lightweight, schema-first, and fully type-safe form library for React, Solid, Vue, Svelte and more.
相关推荐
ngx-admin 表单提交处理:异步操作与状态管理
ngx admin 表单提交处理:异步操作与状态管理 在企业级后台管理系统开发中,表单提交是核心功能之一。ngx admin作为基于Angular和Nebula
前端UI组件PoeCharm:你的中文流放之路角色构建神器
PoeCharm:你的中文流放之路角色构建神器 还在为Path of Building的全英文界面而烦恼吗?每次规划天赋树都要不停地查词典,装备词缀看得一头雾水
游戏开发DeiT Small模型入门:一文读懂deit_small_patch16_224.fb_in1k的核心功能与应用场景
DeiT Small模型入门:一文读懂deit_small_patch16_224.fb_in1k的核心功能与应用场景 在计算机视觉领域, DeiT Small
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考