React.js如何从表单中获取数据并发布它

Vil*_*lly 14 ajax post callback reactjs

我目前正在学习React.js,并且无法使用jquery或ajax调用将表单中的信息返回给帖子.基本上什么信息都在表单中,提交后,在数据中发布一个数据

标签.

这是我的代码:

var BasicInputBox = React.createClass({

  render: function() {
    return (
      <div>
        <label>{this.props.label}</label>
        <br/>
        <input type="text" onChange={this.props.valChange} value={ this.props.val} />
        <br/>
      </div>
    );
  }
});

var CommentBox = React.createClass({
  render: function() {
    return (
      <div>
        <label>Have a question?</label>
        <br/>
        <textarea type="text" onChange={this.props.valChange} value={ this.props.val} />
        <br/>
      </div>
    );
  }
});

var SubmitButton = React.createClass({
  render: function() {
    return (
      <div>
        <button type="submit" onClick={this.props.submit}>
          Submit
        </button>
      </div>
    );
  }
});

var Contact = React.createClass({
  getInitialState: function() {
    return {}
  },
  submit: function(e) {
    e.preventDefault()

    console.log(this.state);
    this.setState({
      name: "",
      email: "",
      comment: ""
    })
  },

  nameChange: function(e) {
    this.setState({
      name: e.target.value
    })
  },
  emailChange: function(e) {
    this.setState({
      email: e.target.value
    })
  },
  commentChange: function(e) {
    this.setState({
      comment: e.target.value
    })
  },


  render: function() {
    return (
      <form>
        <BasicInputBox label="Name:" valChange={this.nameChange} val={this.state.name}/>
        <BasicInputBox label="Email:" valChange={this.emailChange} val={this.state.email}/>
        <CommentBox valChange={this.commentChange} val={this.state.comment}/>
        <SubmitButton submit={this.submit}/>
      </form>

    );
  }
});

React.render(
  <Contact></Contact>,
  document.body
);
Run Code Online (Sandbox Code Playgroud)

fra*_*ure 22

正如@BinaryMuse所指出的那样,问题是你的提交方法并没有真正做任何提交.你提到你想要这样做的方式是通过AJAX,因此你需要1)在你的页面上包含jQuery(或Zepto),以及2)进行ajax调用.以下是完成第二部分的一种方法:

1)首先,您实际上不需要提交submit方法作为提交按钮的属性.当在表单内单击提交按钮时,它将触发表单的onSubmit事件,因此您可以在this.submit那里简单地附加方法.

此外,您真的不需要我不想为Submit按钮创建单独的组件.这种粒度可能在这里不合理,因为你可以用更少的代码行完成同样的事情.因此,我将删除您的SubmitButton组件并将您的Contact组件呈现功能更新为:

    render: function(){
       return (
        <form onSubmit={this.submit}>
          <BasicInputBox label="Name:" valChange={this.nameChange} val={this.state.name}/>
          <BasicInputBox label="Email:" valChange={this.emailChange} val={this.state.email}/>
          <CommentBox valChange={this.commentChange} val={this.state.comment}/>
          <button type="submit">Submit</button>
        </form>
      );
    }
Run Code Online (Sandbox Code Playgroud)

2)接下来,您可以通过这种方式更改提交方法,添加AJAX调用.根据您发送表单的服务器/ API的详细信息,您可能需要稍微修改一下AJAX调用,但我在此处提供的是一个相当通用的表单,很有可能工作:

submit: function (e){
  var self

  e.preventDefault()
  self = this

  console.log(this.state);

  var data = {
    name: this.state.name,
    email: this.state.email,
    comment: this.state.comment
  }

  // Submit form via jQuery/AJAX
  $.ajax({
    type: 'POST',
    url: '/some/url',
    data: data
  })
  .done(function(data) {
    self.clearForm()
  })
  .fail(function(jqXhr) {
    console.log('failed to register');
  });

}
Run Code Online (Sandbox Code Playgroud)

注意:我还封装了之前用于在其自己的函数中清除表单的代码,如果AJAX调用返回成功则调用该代码.

我希望这有帮助.我把代码放在jsFiddle中你可以测试一下:https://jsfiddle.net/69z2wepo/9888/