提交后清除 React 中的表单

2024-05-04

我试图在使用 Axios 创建表单提交后清除表单数据。消息处理良好,响应记录到页面,但每个文本字段中的数据在提交后仍保留在页面上。

我尝试添加一个resetForm函数,我将表单设置回原来的空白状态,但这不起作用。

import React, { Component } from 'react';
import { Grid, Cell, Textfield, Button } from 'react-mdl';
import './Contact.css';
import axios from "axios";

class Contact extends Component {
    constructor(props){
        super(props);
        this.state = {fullName: "", email: "", message: ""};
    }  

    resetForm = () => {
        this.baseState = this.state
        this.setState(this.baseState)
    }

    handleForm = e => {
        axios.post(
        "https://formcarry.com/s/axiosID", 
        this.state, 
        {headers: {"Accept": "application/json"}}
        )
        .then(function (response) {
            let successMessage = document.querySelector('.success-message');
            successMessage.innerHTML = JSON.stringify(response.data.title);
        })
        .catch(function (error) {
            let successMessage = document.querySelector('.success-message');
            successMessage.innerHTML = JSON.stringify(error);
        });

        e.preventDefault();
    }
    handleFields = e => this.setState({ [e.target.name]: 'e.target.value' });

        render() {
            return (
                    <Grid>
                        <Cell col={6}>
                            <h2>Contact Me</h2>
                            <hr/>
                            <div style={{ width: '100%' }} className="contact-list">
                                <form onSubmit={this.handleForm}>
                                    <Cell col={12}>
                                        <Textfield type="text" id="fullName" name="fullName" className="full-name"
                                        onChange={this.handleFields}
                                        label="Full name"
                                        floatingLabel
                                        style={{width: '200px'}}
                                        />
                                    </Cell>
                                    <Cell col={12}>
                                    {/* Textfield with floating label */}
                                        <Textfield type="email" id="email" name="email" className="email-address"
                                        onChange={this.handleFields}
                                        label="Email address"
                                        floatingLabel
                                        style={{width: '200px'}}
                                        />
                                    </Cell>
                                    <Cell col={12}>
                                        {/* Floating Multiline Textfield */}
                                        <Textfield name="message" id="message" className="text-body"
                                        onChange={this.handleFields}
                                        label="Your message..."
                                        rows={10}
                                        style={{width: '400px'}}
                                        />
                                    </Cell>
                                    <Button raised accent ripple type="submit" onClick={this.resetForm}>Send</Button>
                                    <div className="success-message">
                                        <label></label>
                                    </div>
                                </form>
                            </div>
                        </Cell>
                    </Grid>
            )
        }
    }


export default Contact;

我真正想要的是文本字段fullName, email and message提交表单后清除,但数据保留在页面上。


您不需要resetForm函数(完全摆脱它),只需在handleForm中设置你的状态,如下所示:

更新:您还需要向每个输入添加 value 属性,使其成为受控输入,如下所示:

import React, { Component } from 'react';
import { Grid, Cell, Textfield, Button } from 'react-mdl';
import './Contact.css';
import axios from "axios";

class Contact extends Component {
  constructor(props) {
    super(props);
    this.state = { fullName: "", email: "", message: "" };
  }

  handleForm = e => {
    axios.post(
      "https://formcarry.com/s/axiosID",
      this.state,
      { headers: { "Accept": "application/json" } }
    )
      .then(function (response) {
        let successMessage = document.querySelector('.success-message');
        successMessage.innerHTML = JSON.stringify(response.data.title);
      })
      .catch(function (error) {
        let successMessage = document.querySelector('.success-message');
        successMessage.innerHTML = JSON.stringify(error);
      });

    e.preventDefault();
    this.setState({fullName: '', email: '', message: ''}) // <= here
  }
  handleFields = e => this.setState({ [e.target.name]: e.target.value }); 

  render() {
    return (
      <Grid>
        <Cell col={6}>
          <h2>Contact Me</h2>
          <hr />
          <div style={{ width: '100%' }} className="contact-list">
            <form onSubmit={this.handleForm}>
              <Cell col={12}>
                <Textfield type="text" id="fullName" name="fullName" className="full-name"
                  onChange={this.handleFields}
                  value={this.state.fullName} // <= here
                  label="Full name"
                  floatingLabel
                  style={{ width: '200px' }}
                />
              </Cell>
              <Cell col={12}>
                {/* Textfield with floating label */}
                <Textfield type="email" id="email" name="email" className="email-address"
                  onChange={this.handleFields}
                  value={this.state.email} // <= here
                  label="Email address"
                  floatingLabel
                  style={{ width: '200px' }}
                />
              </Cell>
              <Cell col={12}>
                {/* Floating Multiline Textfield */}
                <Textfield name="message" id="message" className="text-body"
                  onChange={this.handleFields}
                  value={this.state.message} // <= here
                  label="Your message..."
                  rows={10}
                  style={{ width: '400px' }}
                />
              </Cell>
              <Button raised accent ripple type="submit">Send</Button>
              <div className="success-message">
                <label></label>
              </div>
            </form>
          </div>
        </Cell>
      </Grid>
    )
  }
}


export default Contact;

作为旁注:查看 React refs 以获取 dom 元素...在此处阅读更多内容:https://reactjs.org/docs/refs-and-the-dom.html https://reactjs.org/docs/refs-and-the-dom.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提交后清除 React 中的表单 的相关文章

随机推荐

  • 显示具有相同节点值的多个 XML 数据条目

    我有一个 XML 文档 其中包含课程信息 如下所示
  • 图像处理编程

    我想知道是否有任何方法可以使用某种编程语言检测图像中对象的位置 例如 如果我有一个球的图像 每 100 毫秒更新一次 是否可以通过某些程序使用某些东西来获取球的坐标 看一下OpenCV http opencv willowgarage co
  • 绑定到 ListView 项目从视图模型中点击的属性

    我正在尝试使用 itemtapped 属性将事件绑定到菜单页面上的 ListView 目前我在我的应用程序中使用 MVVM Xamarin 表单实验室 框架 我想要完成的是当用户点击菜单项时应用程序导航到正确的视图 这是xaml代码
  • docs.microsoft.com 上的 .NET 平台扩展是什么?

    Microsoft Docs 中有一个框架级导航元素 称为 NET 平台扩展 https learn microsoft com en us dotnet api index view dotnet plat ext 2 1 它包含有关最近
  • 在 Matlab 中对列进行排序

    我有 2 列使用 textscan 导入的数据 数据看起来像这样 其中U is undetect and D is detect mydata 51 U 57 D 48 U 47 D my data 4x1 double 4x1 char
  • 在ubuntu 18.04上安装python 2.7

    有没有办法在 Ubuntu 18 04 上安装 Python 2 7 我尝试了这个命令 但它不起作用 sudo apt install python minimal 有没有办法手动安装 我尝试使用 python 2 7 作为不支持 pyth
  • 检查列表视图中的复选框也会检查其他随机复选框

    每当我在列表视图中选中一个复选框时 其他随机复选框也会被选中 这可能是由于列表视图回收项目所致 我也尝试过设置android focusable false 按照某些地方的建议 添加到我的布局中的复选框 但是当选中其复选框时 仍然不会调用
  • STL迭代器是否保证集合更改后的有效性?

    假设我有某种集合 并且我在它的开头获得了一个迭代器 现在假设我修改了该集合 无论集合或迭代器的类型如何 我仍然可以安全地使用迭代器吗 为了避免混淆 以下是我讨论的操作顺序 获取集合的迭代器 修改集合 显然 不是其中的元素 而是集合本身 使用
  • Android 从相机预览中解码位图

    我正在尝试从相机预览中获取位图图像 我将在执行面部检测后对其进行一些处理并绘制一些叠加层 环顾四周后 我发现 onPreviewFrame 获取的字节数组无法直接解码为位图 需要使用 YuvImage 将其转换为正确的像素格式 而这正是我所
  • Python pycrypto 模块:为什么 simplejson 无法转储加密字符串?

    表明统一码错误 utf8 codec can t decode byte 0x82 in position 0 unexpected code byte 这是代码 from Crypto Cipher import AES import s
  • 包含脱机 HTML 的 Visual Studio Code 扩展

    VSCode 扩展是否可以包含在安装扩展时写入磁盘某处 无论在哪里 的 HTML 以便我可以从链接打开该 HTML 例如 我想要在其工具提示中提供指向某个函数的离线文档的链接 是的 您的扩展可以使用标准节点 api 来下载文件 然后你可以
  • 0x800a138f - JavaScript 运行时错误:无法获取未定义或 null 引用的属性“值”

    我编写了一段 JavaScript 代码来比较 2 个文本框中的 2 个日期 function CompareDates var fdate document getElementById txtFromDate var edate doc
  • AZURE:workerrole 中的异步 Run()

    我有一个异步任务 async Task UploadFiles 我想在 azure 工作者角色的 Run 方法中调用 UploadFiles 上的 等待 但 await 仅适用于声明为异步的方法 那么我可以使 Run 方法异步 如下所示 p
  • django celery - 如何将 request.FILES['photo'] 发送到任务

    我正在尝试通过以下方式将 request FILES photo 从我的网站上传的文件 发送到 tCelery tasks upload photos delay img request FILES photo 我收到 pickle 错误
  • 使用 PowerShell 在 IIS FTP 站点上设置权限和设置

    我是 PowerShell 的初学者 我尝试了这个脚本并且运行良好 但我需要将 FTP 授权规则更改为 所有用户 读 写 并将 FTP 用户隔离 更改为 用户名目录 NEEDED FOR IIS CMDLETS Import Module
  • 尝试在 Spring MVC 中使用 OAuth 保护资源

    我们已经在 Spring MVC 上使用 Java 编写了 REST Web 服务 我一直在努力保护它们 OAuth 服务器在另一个网站中实现 该网站处理登录和访问令牌的创建 因此 在允许用户访问网络服务之前 我需要验证访问令牌是否正确 然
  • 如何在java中定期刷新ZipOutputStream

    我正在尝试以 zip 格式存档文件列表 然后即时为用户下载 我在下载 1GB 大小的 zip 时遇到内存不足问题 请帮助我如何在不增加 jvm 堆大小的情况下解决此问题 我想定期冲洗流 我正在尝试定期冲洗 但这对我不起作用 请在下面找到我的
  • 尝试在写入事务之外修改对象

    所以我不知道为什么会出现这个错误 错误信息如下 由于未捕获的异常 RLMException 而终止应用程序 原因 尝试在写入事务之外修改对象 首先在 RLMRealm 实例上调用 beginWriteTransaction 首先抛出调用堆栈
  • ECB、CBC、CFB哪种加密模式

    我的 php 脚本和 c 应用程序将相互传递一个 32 个字符长的哈希字符串 最佳模式是什么 我想到了 ECB 但我不确定 因为它说如果使用超过 1 个区块就不要使用 我如何知道该块有多大 他们偶尔会传递一个大文本文件 这将是加密此 CBC
  • 提交后清除 React 中的表单

    我试图在使用 Axios 创建表单提交后清除表单数据 消息处理良好 响应记录到页面 但每个文本字段中的数据在提交后仍保留在页面上 我尝试添加一个resetForm函数 我将表单设置回原来的空白状态 但这不起作用 import React C