ES6 /用"ajax"反应"this"关键字以从服务器获取数据(教程)

nat*_*ung 4 javascript class this ecmascript-6 reactjs

我正在关注React Beginner Tutorial,我正在尝试将其翻译成ES6.然而,当我改变了CommentBox一个ES6类它开始给我一个this.props.urlundefined错误(在AJAX调用loadCommentsFromServer).我认为这与ES6如何绑定有关this,但是我对语言(也不是React)不太熟悉,所以我不确定.我查看了React 0.13发行说明并看到了这个:

React.createClass具有内置的魔术功能,可以this自动为您绑定所有方法.对于那些在其他类中不习惯此功能的JavaScript开发人员来说,这可能会有点混乱,或者当他们从React迁移到其他类时会让人感到困惑.

我不完全确定,但我认为这意味着我必须保存它的价值(如在let that = this和中.bind(that)),但同样this.props.url也是undefined- 我不知道下一步该去哪里.

这是我目前的代码:

class CommentBox extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: []
    };
  }
  loadCommentsFromServer() {
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      cache: false,
      success: function(data) {
        this.setState({
          data: data
        })
      }.bind(this)
    });
  }
  handleCommentSubmit(comment) {
    var comments = this.state.data;
    var newComments = comments.concat([comment]);
    this.setState({ data: newComments });
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      type: 'POST',
      data: comment,
      success: function(data) {
        this.setState({ data: data });
      },
      error: function(xhr, status, err) {
        console.error(this.props.url, status, err.toString());
      }.bind(this)
    });
  }
  componentDidMount() {
    this.loadCommentsFromServer();
    setInterval(this.loadCommentsFromServer, this.props.pollInterval);
  }
  render() {
    return (
      <div className="commentBox">
        <h1>Comments</h1>
        <CommentList data={this.state.data}/>
        <CommentForm onCommentSubmit={this.handleCommentSubmit}/>
      </div>
    );
  }
};
Run Code Online (Sandbox Code Playgroud)

Rya*_*uan 5

您需要使用bind(this)绑定事件.如下:

componentDidMount() {
    this.loadCommentsFromServer().bind(this);
    setInterval(this.loadCommentsFromServer.bind(this), this.props.pollInterval);
  }
Run Code Online (Sandbox Code Playgroud)

您可以从以下链接中读取参考:https: //facebook.github.io/react/docs/reusable-components.html#no-autobinding

No Autobinding Methods遵循与常规ES6类相同的语义,这意味着它们不会自动将其绑定到实例.你必须明确地使用.bind(this)或arrow functions =>.