javascript - 在 React JS 中序列化 <form> 数据提交 POST 请求

标签 javascript ajax forms serialization reactjs

我有一个非常基本的评论表单,它接受用户的一些文本输入并通过 AJAX 发送 POST 请求以创建新评论。

var CommentForm = React.createClass({
  propTypes: {
    // ...
    // ...
  },

  handleFormSubmit: function(e) {
    e.preventDefault();

    var component = this;

    return $.ajax({
      type: "POST",
      url: this.props.someURL,
      data: // ???? - Need to figure out how to serialize data here,
      dataType: "json",
      contentType: "application/json",
      success: (function(response){ alert("SUCESS") }),
      error: (function(){ alert("ERROR"); })
    });
  },

  render: function() {
    var component = this;

    return (
      <form onSubmit={component.handleFormSubmit} className="comments__form" id="new_comment" accept-charset="UTF-8">
        // ...
      </form>
    );
  }
});

我需要序列化表单数据以随我的 POST 请求一起发送,但我不确定如何操作。我知道在 JQuery 中我可以选择表单元素并执行类似 $("#my_form").serialize() 的操作,但我似乎无法从 React 组件内部调用它(不确定为什么?)

其他一些 stackoverflow 答案建议为每个相关的 DOM 元素添加一个 ref='foo' 然后我可以使用 React.findDOMNode(this.refs.foo).getValue( );。这工作正常,但它让我手动构建整个序列化表单数据字符串,如果表单更长更复杂,这就不太好。

// Sample serialized form string
"utf8=✓&authenticity_token=+Bm8bJT+UBX6Hyr+f0Cqec65CR7qj6UEhHrl1gj0lJfhc85nuu+j2YhJC8f4PM1UAJbhzC0TtQTuceXpn5lSOg==&comment[body]=new+comment!"

是否有更惯用的方法来解决这个问题 - 也许是一个帮助程序可以让我在 ReactJS 中序列化我的表单数据?

谢谢!

最佳答案

您通常会使用组件 state存储所有信息。

例如,当输入文本更改时,您将更改状态以反射(reflect):

<input type="text" onChange={ (e) => this.setState({ text: e.target.value }) }

然后,在提交表单时,您可以使用 this.state.text 访问该值.

这确实意味着您必须自己构建对象,但是,这可以通过循环实现:

this.state.map((value, index) => {
  obj[index] = value;
});

然后发送obj作为发布数据。

更新

更新状态的唯一性能问题是每次都会重新渲染组件。这不是问题,并且是 React 组件的工作方式,只要您注意渲染方法的大小及其正在执行的操作即可。

常用 HTML 中的表单 <form>标签意义,在 React 中不存在。您使用表单组件来更改状态。我建议阅读 React Forms

就 UTF8 标志而言,这将是隐藏字段的值,因此您可以使用 refs在这种情况下,为您的对象获取该值:

<input type="text" ref="utf8" value="✓" />

obj.utf8 = this.refs['utf8'].value

关于javascript - 在 React JS 中序列化 <form> 数据提交 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38937915/

相关文章:

javascript - 动态调整 Chrome 扩展弹出窗口高度

javascript - 如何根据 JSON 数据中的纬度和经度将 map 居中,并且当单击标记时,会弹出一个窗口并在 vueJS 中显示名称?

jquery - AJAX:加载 HTML、CSS 链接不起作用

jquery - 使用 jQuery 存储复杂表单的状态

ruby-on-rails - has_and_belongs_to_many 关系的自定义 Active Admin 表单输入

javascript - 我能否让 Internet Explorer 调试器中断长时间运行的 JavaScript 代码?

javascript - cakePHP scriptStart() 和 scriptEnd(),如何使用?

javascript - 具有回调函数的 AJAX

javascript - POST 数据时 Ajax 调用返回 403 或 400

javascript - 将复选框标签复制到隐藏文本字段