用途:为 Remix v2 应用中表单提交与数据变更提供规范做法。核心回路由 <Form method="post">(或 <fetcher.Form>)、解析 request.formData() 并返回 redirect(...) 或 json(...) 的 action、以及用 useActionData()/fetcher.data 读错误、useNavigation()/fetcher.state 读挂起状态组成。绕过该回路(如 fetch()、原生 form、客户端状态)会失去重新验证、渐进增强与竞态安全。
主要能力:介绍 <Form>(导航式提交并触发全页重验证)、<Form navigate={false}>、useFetcher()(非导航提交,适合行内变更)、useFetchers()(只读的全局进行中状态数组)、useNavigation()、useSubmit()、useActionData() 等原语,并说明状态流转(非 GET 为 idle→submitting→loading→idle;GET 导航跳过 submitting,而 fetcher 除 fetcher.load() 外会经过 submitting)。
关键模式:<Form> 改变 URL、加历史并重验证所有 loader;useFetcher 做同样重验证但停留当前 URL,每次调用是独立提交通道;同一路由多操作时 action 依据 formData.get("intent") 分支,按钮以 name/value 区分;乐观 UI 直接读 fetcher.formData / navigation.formData,不要镜像进本地 state;文件上传须加 encType="multipart/form-data",否则 request.formData() 只得到文件名字符串,需用 unstable_parseMultipartFormData 与有界上传处理器(v2 中 unstable_ 前缀为长期保留)。
选择建议:需要变更后改变 URL 用 <Form> + redirect;针对行/单元格/开关且停留原页用 useFetcher;导航外加载数据用 fetcher.load(href);其余默认 <Form>。挂起状态:全局用 useNavigation(),fetcher 变更用对应 fetcher.state,行内指示用每行 fetcher.state 或 useFetchers(),本地表单加 navigation.formAction 路径校验。自建路由的变更不要用 fetch()/axios。
限制:资料未提供安装方式、版本兼容细节、收费或平台信息。