表单 (Form)

<Form> 组件扩展了 HTML <form> 元素的功能,提供 客户端导航 提交以及 渐进增强 特性。

对于需要更新 URL 搜索参数的表单特别有用,因为它减少了实现上述功能所需的样板代码。

基本用法:

import Form from 'next/form'

export default function Page() {
  return (
    <Form action="/search">
      {/* 提交时,输入值会被附加到 URL,例如 /search?query=abc */}
      <input name="query" />
      <button type="submit">提交</button>
    </Form>
  )
}
import Form from 'next/form'

export default function Search() {
  return (
    <Form action="/search">
      {/* 提交时,输入值会被附加到 URL,例如 /search?query=abc */}
      <input name="query" />
      <button type="submit">提交</button>
    </Form>
  )
}

参考文档

<Form> 组件的行为取决于 action 属性接收的是 string 还是 function

  • action字符串 时,<Form> 行为类似于使用 GET 方法的原生 HTML 表单。表单数据会被编码为 URL 搜索参数,提交时导航到指定 URL。此外 Next.js 会:

action (字符串) 属性

action 为字符串时,<Form> 组件支持以下属性:

属性示例类型必填
actionaction="/search"string (URL 或相对路径)
replacereplace={false}boolean-
scrollscroll={true}boolean-
  • action:表单提交时要导航到的 URL 或路径
    • 空字符串 "" 会导航到相同路由但更新搜索参数
  • replace:替换当前历史记录而非添加新记录到 浏览器历史 栈。默认为 false
  • scroll:控制导航时的滚动行为。默认为 true,即滚动到新路由顶部,并在前进/后退导航时保持滚动位置

注意事项

  • onSubmit:可用于处理表单提交逻辑。但调用 event.preventDefault() 会覆盖 <Form> 行为(如导航到指定 URL)
  • methodencTypetarget:不支持这些属性,因为它们会覆盖 <Form> 行为
    • 类似地,formMethodformEncTypeformTarget 可用于覆盖相应属性,但使用它们会回退到原生浏览器行为
    • 如需使用这些属性,请改用 HTML <form> 元素
  • <input type="file">:当 action 为字符串时使用此输入类型,会遵循浏览器行为提交文件名而非文件对象

On this page