【问题标题】:How to get a form to disapear upon submission in React如何让表单在 React 中提交后消失
【发布时间】:2020-05-10 08:12:44
【问题描述】:

这是网站上的“联系我们”表单。
我希望用户在“成功”后单击“提交”按钮后表单的所有单元格都消失。换句话说,如果提交成功,我不会再呈现表单。由于这是 React,我不希望页面进行老式的重新加载,只要满足条件就可以了。 现在它在提交时的工作方式只有在提交成功时按钮会消失,如果提交失败则不会消失,这可以保持不变。

这是一个表单,它使用带有 Google Apps 脚本的 XML 在提交时发送用户输入的表单数据。这一切都工作正常,并且在“状态”状态中存在与 onSubmit 操作一起使用的东西,这使得条件渲染变得不那么直接。

如果您想对此进行测试以解决问题
因为我不想把我的电子邮件代码放在那里,你应该在 'this.setState({ status: "ERROR" });' 的底部附近设置 'else' 条件来设置 'status' 说 'SUCCESS'因此电子邮件发送功能(底部)中的 if/else 将呈现表单,就好像数据通过并发送了电子邮件一样。我的建议。

下面的代码是组件正常工作的方式,但我解决这个问题的尝试是将 上方的所有单元格存储为变量,如果“状态”> 0,则“返回”它。因为按下按钮之前的状态为“”。这只是导致整个页面重新加载,重新渲染整个 DOM 而没有发送电子邮件。

  import React from 'react';

  export default class MyForm extends React.Component {
    constructor(props) {
      super(props);
      this.submitForm = this.submitForm.bind(this);
      this.state = {
        status: ""
      };
    }
    render() {
      const { status } = this.state;
      return (
        <form
          onSubmit={this.submitForm}
          action="https://script.google.com/macros/s/000000AKfycbz000000000C0/exec"
          method="POST"
        >
              <div className="row_10" style={{"margin-top": "30px"}}>
                <div className="col-25">
                </div>
                <div className="col-75">
                  <input type="text" id="name" name="Name" placeholder="Name:"/>
                </div>
              </div>
              <div className="row_10">
                <div className="col-25">
                </div>
                <div className="col-75">
                  <input type="text" id="Phone" name="Phone" placeholder="Phone:"/>
                </div>
              </div>
              <div className="row_10">
                <div className="col-25">
                </div>
                <div className="col-75">
                  <input type="text" id="Email" name="Email" placeholder="Email:"/>
                </div>
              </div>
              <div className="row_10">
                <div className="col-25">
                </div>
              </div>
              <div className="row_10">
                <div className="col-25">
                </div>
                <div className="row_10">
                  <textarea className="col-75_T" id="subject" name="subject"  placeholder="How can we help you?" style={{"height": "190px"}}></textarea>
                </div>
              </div>
              <div className="subm_button">
                <div className="col-25">
                </div>
                </div>
              {status === "SUCCESS" ? <p>Thank you! We will talk to you soon!</p> :<a href=""><input onClick="fbq('track', 'Contact');" type="submit" value="Submit"/></a>}
              {status === "ERROR" && <p>Ooops! There was an error.</p>}
        </form>
      );
    }
    submitForm(ev) {
      ev.preventDefault();
      const form = ev.target;
      const data = new FormData(form);
      const xhr = new XMLHttpRequest();
      xhr.open(form.method, form.action);
      xhr.setRequestHeader("Accept", "application/json");
      xhr.onreadystatechange = () => {
        if (xhr.readyState !== XMLHttpRequest.DONE) return;
        if (xhr.status === 200) {
          form.reset();
          this.setState({ status: "SUCCESS" });
        } else {
          this.setState({ status: "ERROR" });
        }
      };
      xhr.send(data);
    }
  }

【问题讨论】:

  • 原始 XHR 请求,crikey,你知道fetch吗?
  • “现在它在提交时的工作方式只有在提交成功时按钮才会消失” - 你在你的代码中看到它是如何完成的吗?您是否尝试将相同的模式应用于表单的其余部分?
  • "您在您的代码中看到这是如何实现的吗?" 不,我想知道。我不知道是什么导致了这种情况。
  • @David “您是否尝试将相同的模式应用于表单的其余部分?”感谢詹姆斯的回答,我正在努力。不锻炼。在他的回答下方评论。谢谢。

标签: reactjs forms conditional-statements


【解决方案1】:

将与消息相同的逻辑应用于表单

renderForm() {
  return (
    <form
      onSubmit={this.submitForm}
      action="https://script.google.com/macros/s/000000AKfycbz000000000C0/exec"
      method="POST"
    >
          <div className="row_10" style={{"margin-top": "30px"}}>
            <div className="col-25">
            </div>
            <div className="col-75">
              <input type="text" id="name" name="Name" placeholder="Name:"/>
            </div>
          </div>
          <div className="row_10">
            <div className="col-25">
            </div>
            <div className="col-75">
              <input type="text" id="Phone" name="Phone" placeholder="Phone:"/>
            </div>
          </div>
          <div className="row_10">
            <div className="col-25">
            </div>
            <div className="col-75">
              <input type="text" id="Email" name="Email" placeholder="Email:"/>
            </div>
          </div>
          <div className="row_10">
            <div className="col-25">
            </div>
          </div>
          <div className="row_10">
            <div className="col-25">
            </div>
            <div className="row_10">
              <textarea className="col-75_T" id="subject" name="subject"  placeholder="How can we help you?" style={{"height": "190px"}}></textarea>
            </div>
          </div>
          <div className="subm_button">
            <div className="col-25">
              <a href=""><input onClick="fbq('track', 'Contact');" type="submit" value="Submit"/></a>
            </div>
            </div>
    </form>
  );
}

render() {
  const { status } = this.state;
  const submitted = status === "SUCCESS";
  return (
    <>
      {!submitted && this.renderForm()}
      {submitted && <p>Thank you! We will talk to you soon!</p>}
      {status === "ERROR" && <p>Ooops! There was an error.</p>}
    </>
  );
}

【讨论】:

  • 我确信这更接近解决方案,但我不认为它连接到通过应用程序发送电子邮件的功能。我得到'哎呀!有一个错误。'即刻。有什么不是在等待什么?我不知道。此外,“renderForm”的顶部没有大写的 F。另外,我认为您想要一个“&&”而不是“?”在“谢谢!”线。我猜。也许问题是这条线。
  • 如果我将按钮移至“谢谢!”行页面重新加载旧时尚风格并且不发送电子邮件。这是一个泡菜,因为它似乎不允许表单之前完成提交。您的回答类似于我尝试将表单存储在 var 中。我不明白。我把按钮放在... {提交?

    谢谢!我们会尽快与您联系!

    :}
  • @HughMungus ? 是一个错误,应该是&amp;&amp;,这以前是三元检查,但现在不再是,只是一个已修复的错字。和renderForm一样,上面的函数应该是大写的F(抱歉我昨晚在我的移动设备上写了这个,自动更正和改变东西很糟糕?‍♂️)
  • 谢谢,@James。但是,就像我说的那样,我马上就会‘哎呀。有一个错误。'如果我使用您的代码将按钮移到函数之外,它只会重新加载整个页面而不发送电子邮件。我认为有些东西没有联系。在邮件发送功能运行之前,React 必须让某些事情发生。此外,您的第二个 应该是一个 >。
  • 保持一切不变,但将较低的 更改为 > 并将 {submitted &amp;&amp; &lt;p&gt;Thank... 更改为 {status === "SUCCESS" &amp;&amp; ... 使其正常工作,如果您想更新答案,我会给您绿色检查.
猜你喜欢
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多