<Form>
<Form>
组件扩展了 HTML 的 <form>
元素,提供了预获取的 加载 UI、客户端导航提交以及渐进式增强功能。
对于需要更新 URL 搜索参数的表单来说,它很有用,因为它减少了实现上述功能所需的样板代码。
基本用法:
参考
<Form>
组件的行为取决于 action
属性是传入字符串还是函数。
- 当
action
是字符串时,<Form>
的行为类似于使用GET
方法的原生 HTML 表单。表单数据会被编码到 URL 的搜索参数中,当表单提交时,会导航到指定的 URL。此外,Next.js 还会: - 当
action
是函数 (服务端操作) 时,<Form>
的行为类似于 React 表单,在表单提交时执行该操作。
action
(字符串) 属性
当 action
是字符串时,<Form>
组件支持以下属性:
属性 | 示例 | 类型 | 是否必需 |
---|---|---|---|
action | action="/search" | string (URL 或相对路径) | 是 |
replace | replace={false} | boolean | - |
scroll | scroll={true} | boolean | - |
prefetch | prefetch={true} | boolean | - |
action
:表单提交时要导航到的 URL 或路径。- 空字符串
""
将导航到同一路由,但会更新搜索参数。
- 空字符串
replace
:替换浏览器历史记录栈中的当前状态,而不是添加新的状态。默认为false
。scroll
:控制导航期间的滚动行为。默认为true
,这意味着它会滚动到新路由的顶部,并在前进和后退导航时保持滚动位置。prefetch
:控制当表单在用户视口中可见时是否应该预获取路径。默认为true
。
action
(函数) 属性
当 action
是函数时,<Form>
组件支持以下属性:
属性 | 示例 | 类型 | 是否必需 |
---|---|---|---|
action | action={myAction} | function (服务端操作) | 是 |
action
:表单提交时要调用的服务端操作。更多信息请参阅 React 文档。
值得注意的是:当
action
是函数时,replace
和scroll
属性会被忽略。
注意事项
formAction
:可以在<button>
或<input type="submit">
字段中使用,以覆盖action
属性。Next.js 将执行客户端导航,但是这种方法不支持预获取。- 当使用
basePath
时,你还必须在formAction
路径中包含它。例如formAction="/base-path/search"
。
- 当使用
key
:不支持向字符串类型的action
传递key
属性。如果你想触发重新渲染或执行变更,可以考虑使用函数类型的action
。
onSubmit
:可以用来处理表单提交逻辑。但是,调用event.preventDefault()
会覆盖<Form>
的行为,比如导航到指定的 URL。method
、encType
、target
:不支持这些属性,因为它们会覆盖<Form>
的行为。- 同样,
formMethod
、formEncType
和formTarget
可以用来覆盖method
、encType
和target
属性,使用它们将回退到浏览器原生行为。 - 如果你需要使用这些属性,请使用 HTML 的
<form>
元素。
- 同样,
<input type="file">
:当action
是字符串时使用这种输入类型,将匹配浏览器的行为,提交文件名而不是文件对象。
示例
导向搜索结果页面的搜索表单
你可以通过将路径作为 action
传递来创建一个导航到搜索结果页面的搜索表单:
当用户更新查询输入字段并提交表单时,表单数据将被编码到 URL 的搜索参数中,例如 /search?query=abc
。
值得注意的是:如果你向
action
传递一个空字符串""
,表单将导航到同一路由,但会更新搜索参数。
在结果页面中,你可以使用 searchParams
page.js
属性访问查询,并用它从外部源获取数据。
当 <Form>
在用户视口中可见时,/search
页面上的共享 UI (如 layout.js
和 loading.js
) 将被预获取。提交时,表单将立即导航到新路由,并在获取结果时显示加载 UI。你可以使用 loading.js
设计加载状态的 UI:
为了处理共享 UI 尚未加载的情况,你可以使用 useFormStatus
向用户显示即时反馈。
首先,创建一个在表单处于待处理状态时显示加载状态的组件:
然后,更新搜索表单页面以使用 SearchButton
组件:
使用服务端操作进行数据变更
你可以通过向 action
属性传递函数来执行数据变更。
继续翻译前面的内容:
在数据变更后,通常需要重定向到新的资源。你可以使用来自 next/navigation
的 redirect
函数导航到新的文章页面。
值得注意的是:由于表单提交的"目的地"要等到操作执行后才能知道,所以
<Form>
无法自动预获取共享 UI。
然后,在新页面中,你可以使用 params
属性获取数据:
更多示例请参阅服务端操作文档。