react router 在 v6 版本提供了一个基于 form表单元素 的增强组件 Form,可以与 react router 的数据操作配合使用
简单了解 form 表单
<form> 是 HTML 中收集用户输入数据并提交到服务器的容器标签,主要使用两个核心属性
action:表单数据提交的 URL,默认提交到当前的 URLmethod:提交数据使用的 HTTP 方法,默认为get
form 标签中通常使用 <input> 和 <button> 作为输入标签,简单示例如下
1 | <form action="/submit" method="post"> |
对于以上示例,浏览器对 form 表单的默认提交流程如下
- 浏览器收集 form 表单中带有
name属性的输入标签,将name和输入值组成键值对 - 对数据进行编码,默认编码为
application/x-www-form-urlencoded - 向
/submit地址发送一个post请求 - 页面刷新或跳转
位于 <form> 标签中的 <button> 按钮,其默认行为会被修改为 submit,即使没有显式指定 type=submit,因此在表单中使用 <button> 作为普通按钮,应该设置 type=button
action 属性
在 HTML 的 form 标签中,action 属性要求指定一个绝对路径,Form 组件默认使用的是当前路由的路径
1 | function ProjectsLayout() { |
以上示例中,<ProjectsLayout> 的 URL 为 /projects,因此 <Form> 中的 action 默认为 /projects
method 属性
method 属性默认为 get,此时 Form 组件与 HTML 的 form 标签行为一致,提交时会将表单数据编码为查询参数,添加到 URL 中并进行导航
1 | <Form method="get" action="/products"> |
若用户输入 food,则查询参数为 q=food,点击按钮提交后会导航到 /products?q=food
对于其他 method 值,如 post、delete 等,react router 会将 action 地址与路由的路径匹配,调用该路由的 action 回调,实现数据写入与导航逻辑
对于
post、delete之类的方法,导航逻辑需要在路由的action回调中手动实现,因此 react router 中的 Form 默认不会进行导航
导航
Form 组件在提交后可能进行导航,可以使用 navigate={false} 来禁止导航
Form 导航也支持 replace、relative、state 等参数
useSubmit
useSubmit 函数用于程序式地实现 Form 表单提交,简单示例如下
1 | import { useSubmit } from 'react-router'; |
submit 函数接收两个参数
target:提交数据,SubmitTarget类型options:表单属性及导航选项
target 参数
target 参数为 SubmitTarget 类型,可以传入提交元素的 DOM、FormData、URL 查询参数以及 JSON 数据,定义如下
1 | type SubmitTarget = HTMLFormElement | HTMLButtonElement | HTMLInputElement | FormData | URLSearchParams | JsonValue | null; |
示例如下
1 | import { useSubmit } from 'react-router'; |
options 参数
options 参数接收一个对象,其中的可设置项与 Form 组件属性基本相同
actionmethodnavigaterelativereplacestate