You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 13服务端组件中提交表单后如何清空表单?

解决Next.js 13表单提交后清空字段的问题

你的表单组件已经标记为"use client"客户端组件,完全可以利用React客户端能力实现表单清空,以下是两种可行方案:

方案一:使用表单元素的reset()方法

通过useRef获取表单DOM元素,在服务端Action执行完成后调用reset()方法一键清空所有字段:

"use client"

import { addProductToDB } from "@/actions/serverActions"
import { useRef } from "react"

function Form() {
  const formRef = useRef<HTMLFormElement>(null)

  const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault()
    const formData = new FormData(e.currentTarget)
    await addProductToDB(formData)
    // 提交完成后重置表单
    formRef.current?.reset()
  }

  return (
    <form ref={formRef} onSubmit={handleSubmit} className='flex flex-col gap-5 max-w-xl mx-auto p-5'>
        <input type="text" 
          name='product'
          placeholder='输入产品名称'
          className='border border-gray-300 p-2 rounded-md'
        />
        <input type="text" 
         name='price'
         placeholder='输入价格'
         className='border border-gray-300 p-2 rounded-md'
        />
        <button type="submit" className='border bg-blue-500 text-white p-2 rounded-md'>
            添加
        </button>
      </form>
  )
}

export default Form

方案二:用State控制输入值

通过useState绑定输入框的值,提交完成后重置State来清空字段,适合需要实时处理输入校验、格式转换等客户端逻辑的场景:

"use client"

import { addProductToDB } from "@/actions/serverActions"
import { useState } from "react"

function Form() {
  const [product, setProduct] = useState("")
  const [price, setPrice] = useState("")

  const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault()
    const formData = new FormData()
    formData.append("product", product)
    formData.append("price", price)
    await addProductToDB(formData)
    // 重置输入状态
    setProduct("")
    setPrice("")
  }

  return (
    <form onSubmit={handleSubmit} className='flex flex-col gap-5 max-w-xl mx-auto p-5'>
        <input type="text" 
          name='product'
          value={product}
          onChange={(e) => setProduct(e.target.value)}
          placeholder='输入产品名称'
          className='border border-gray-300 p-2 rounded-md'
        />
        <input type="text" 
         name='price'
         value={price}
         onChange={(e) => setPrice(e.target.value)}
         placeholder='输入价格'
         className='border border-gray-300 p-2 rounded-md'
        />
        <button type="submit" className='border bg-blue-500 text-white p-2 rounded-md'>
            添加
        </button>
      </form>
  )
}

export default Form

说明

虽然提交逻辑是服务端Action,但表单本身是客户端组件,完全可以使用React的客户端hooks来处理UI状态。两种方案都能在提交成功后清空字段,你可以根据是否需要额外的客户端输入逻辑来选择。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:56:23