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

如何在React组件中点击提交按钮后重置表单字段值?

解决方案

你现在用的是非受控表单实现,reset()方法不生效的核心原因是调用时机不对,或者没有正确拿到表单DOM引用,按下面两种方案修改都可以实现提交后清空表单:

方案1:沿用现有非受控写法(改动最小)

原生DOM的form.reset()方法本身是有效的,你只需要把清空操作放到emailjs.sendForm的异步回调中,避免异步请求没完成就提前操作的问题,修改后的sendEmail函数如下:

const sendEmail = (e) => {
  e.preventDefault();

  const serviceId='...';
  const templateId='...';
  const userId='...';

  emailjs.sendForm(serviceId, templateId, form.current, userId)
    .then((result) => {
        console.log(result.text);
        // 方式1:用你定义的ref操作表单,和方式2选一种即可
        form.current.reset();
        // 方式2:用事件对象拿到表单元素
        // e.target.reset();
    }, (error) => {
        console.log(error.text);
    });
};

非受控表单的reset()方法会直接把所有表单输入项重置为初始值,你现在的输入项没有设置默认值,调用后会直接清空所有内容。

方案2:改为React受控表单(更灵活,可扩展性更高)

如果后续需要对表单做校验、动态修改值等操作,推荐改成受控组件写法,通过state管理表单值:

import React, { useState } from 'react';
import emailjs from 'emailjs-com';

const Contact = () => {
  // 定义state存储表单字段
  const [formData, setFormData] = useState({
    fromName: '',
    fromEmail: '',
    message: ''
  });

  // 表单输入同步更新state
  const handleChange = (e) => {
    const { name, value } = e.target;
    setFormData(prev => ({...prev, [name]: value}));
  };

  const sendEmail = (e) => {
    e.preventDefault();

    const serviceId='...';
    const templateId='...';
    const userId='...';

    emailjs.send(serviceId, templateId, formData, userId)
      .then((result) => {
          console.log(result.text);
          // 提交成功后清空state,表单自动同步清空
          setFormData({
            fromName: '',
            fromEmail: '',
            message: ''
          });
      }, (error) => {
          console.log(error.text);
      });
    };

    return (
        <form onSubmit={sendEmail}>
            <div className="field half first">
                <label htmlFor="name">Name</label>
                <input 
                  type="text" 
                  name="fromName" 
                  id="name"
                  value={formData.fromName}
                  onChange={handleChange}
                />
            </div>
            <div className="field half">
                <label htmlFor="email">Email</label>
                <input 
                  type="text" 
                  name="fromEmail" 
                  id="email"
                  value={formData.fromEmail}
                  onChange={handleChange}
                />
            </div>
            <div className="field">
                <label htmlFor="message">Message</label>
                <textarea 
                  name="message" 
                  id="message" 
                  rows="4"
                  placeholder = "..."
                  value={formData.message}
                  onChange={handleChange}
                ></textarea>
            </div>
            <ul className="actions">
                <li>
                    <input type="submit" value="Send Message" className="special"/>
                </li>
            </ul>
        </form>
    );
};

export default Contact

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:45:00