【问题标题】:How do I get form data?如何获取表单数据?
【发布时间】:2020-07-08 20:09:30
【问题描述】:

我正在编写一个 React 应用程序,当尝试获取登录表单数据以发送到后端时,它是空的。

// Login component class
submitLoginForm = (event) => {
    event.preventDefault();
    const target = event.target;
    const data = new FormData(target);
    // data is empty, but I need it to contain the form data.
    // ...
}

render() {
    return (
        <div>
            <form onSubmit={this.submitLoginForm}>
                <input type="hidden" name="csrfmiddlewaretoken" value={Cookies.get("csrftoken")} />
                <label htmlFor="username">Username: </label>
                <input id="username" name="username" type="text" />

                <label htmlFor="password">Password: </label>
                <input id="password" name="password" type="password" />

                {this.state.errorText}
                <input type="submit" value="submit" />
            </form>
        </div>
    );
}

编辑:虽然 FormData 对象确实具有表单数据,但将其传递给 fetch 请求无法传递任何数据,而是仅发送一个空的 JSON 对象。 JSON.stringify 也会出现同样的结果。如何将数据作为 JSON 对象获取?

【问题讨论】:

  • 您必须为每个文本字段写入更改属性,并在 onchnage 函数中为各自的状态分配值。

标签: javascript reactjs forms


【解决方案1】:

不确定这是否是理想的方法,但您可以像这样从formData.entries() 建立一个 pojo,然后从那里做任何您需要做的事情。

const submitLoginForm = e => {
  e.preventDefault();
  const fd = new FormData(e.target);
  const formObj = [...fd.entries()].reduce((acc, [key, value]) => ({...acc, [key]: value}), {});
  console.log(formObj);
}
<form onsubmit="submitLoginForm(event)">
  <label htmlFor="username">Username: </label>
  <input id="username" name="username" type="text" />

  <label htmlFor="password">Password: </label>
  <input id="password" name="password" type="password" />
  <input type="submit" value="submit" />
</form>

【讨论】:

    【解决方案2】:

    TBH 我没有太多运气让FormData 与 React 配合得很好。您可以访问表单的onSubmit 事件对象的表单字段。

    // Login component class
    submitLoginForm = (event) => {
      event.preventDefault();
      const target = event.target;
      const data = {
        username: target.username.value,
        password: target.password.value,
      };
      // JSON.stringify(data) in request body
    }
    

    【讨论】:

    • 这将起作用并且更简单。我更喜欢 formData.entries() 方法的原因是它避免了 submitLoginForm 必须知道表单中有哪些字段。
    • @rayhatfield 当然...这只是两个字段,通常onSubmit 处理程序将与表单组件一起定义。 array::reduce 解决方案更通用,但您仍然在回调中定义它in,因此它很有用。不过,将其分解为表单数据缩减实用程序将是实用的。
    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2019-04-13
    • 2017-05-02
    • 2019-11-11
    • 2017-12-31
    相关资源
    最近更新 更多