ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – ES6 /用ajax反复“this”关键字从服务器获取数据(教程)

2019-05-28 06:20:15  阅读:209  来源: 互联网

标签:javascript this ecmascript-6 reactjs class


参见英文答案 > Unable to access React instance (this) inside event handler                                    16个
我正在关注React Beginner Tutorial,我正试图将其翻译成ES6.但是,当我将CommentBox更改为ES6类时,它开始给我一个this.props.url是未定义的错误(在loadCommentsFromServer的AJAX调用中).我认为这与ES6如何绑定它有关,但是我对语言(也不是React)不太熟悉,所以我不确定.我看了React 0.13 release notes,看到了这个:

React.createClass has a built-in magic feature that bound all methods to this automatically for you. This can be a little confusing for JavaScript developers that are not used to this feature in other classes, or it can be confusing when they move from React to other classes.

我不完全确定,但我认为这意味着我必须保存这个值(就像在那个= this和.bind(那))但是也给了相同的this.props.url是未定义的 – 我’我不知道下一步该去哪里.

这是我目前的代码:

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>
    );
  }
};

解决方法:

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

componentDidMount() {
    this.loadCommentsFromServer().bind(this);
    setInterval(this.loadCommentsFromServer.bind(this), this.props.pollInterval);
  }

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

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

标签:javascript,this,ecmascript-6,reactjs,class
来源: https://codeday.me/bug/20190528/1169065.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有