当前位置: 首页 > 知识库问答 >
问题:

ES6/React“this”关键字与ajax一起从服务器获取数据(教程)[重复]

夏侯兴怀
2023-03-14

我正在学习React初学者教程,并试图将其翻译成ES6。但是,当我将CommentBox更改为ES6类时,它开始给我一个this.props.url未定义的错误(在loadCommentsFromServer中的AJAX调用中)。我认为这与ES6如何绑定this有关,但我对这门语言不太熟悉(也不太熟悉),所以我不确定。我查看了React 0.13发行说明,看到了以下内容:

React.createClass有一个内置的神奇功能,可以为您自动将所有方法绑定到this。对于其他类中不习惯此功能的JavaScript开发人员来说,这可能有点让人困惑,或者当他们从React移动到其他类时,这可能会让人困惑。

我不太确定,但我认为这意味着我必须保存这个的值(如let that=this. bind(that)),但这也给了相同的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>
    );
  }
};

共有3个答案

江华容
2023-03-14

这是特定于作为ES6类实现的React.Component的行为。使用ES5样式时,React组件自动绑定其所有功能。使用ES6类样式时,自动绑定的唯一方法是React.ComponentrendercomponentDidMount等)中专门包含的方法。

这实际上在文档中提到过,尽管很容易忽略。

别难过;我知道它在文档中,因为我第一次将一些可用的React组件移植到ES6类时,就不得不去寻找它。

通俊发
2023-03-14

在诸如success和error之类的回调函数中,作用域会发生变化,因此“this”不再是CommentBox。

你需要做一些事情,比如:

handleCommentSubmit(comment) {
    var comments = this.state.data;
    var newComments = comments.concat([comment]);
    this.setState({ data: newComments });
    var comment_box = this;
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      type: 'POST',
      data: comment,
      success: function(data) {
        comment_box.setState({ data: data });
      },
      error: function(xhr, status, err) {
        console.error(comment_box.props.url, status, err.toString());
      }.bind(this)
    });
  }

将此应用于代码中的其他适用位置

顾恺
2023-03-14

你需要使用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-自动绑定

没有自动绑定方法遵循与常规ES6类相同的语义学,这意味着它们不会自动将其绑定到实例。您必须显式地使用. bind(this)或箭头函数=

 类似资料:
  • 试图从GET服务获取响应时,ajax函数总是运行在错误部分。 当浏览器执行代码时,我得到了这个结果: 数据:[对象] 我尝试了dataType:"json",但我得到了这个错误在chrome调试控制台: 请求的资源上没有访问-控制-允许-起源标头。因此,不允许访问源'null'。 并打印警报: data:[对象对象] 文本状态:错误 jqXHR:错误: ****编辑**** 我用这个chrome应

  • 涵义 this关键字是一个非常重要的语法点。毫不夸张地说,不理解它的含义,大部分开发任务都无法完成。 前一章已经提到,this可以用在构造函数之中,表示实例对象。除此之外,this还可以用在别的场合。但不管是什么场合,this都有一个共同点:它总是返回一个对象。 简单说,this就是属性或方法“当前”所在的对象。 this.property 上面代码中,this就代表property属性当前所在

  • 本文向大家介绍node.js+Ajax实现获取HTTP服务器返回数据,包括了node.js+Ajax实现获取HTTP服务器返回数据的使用技巧和注意事项,需要的朋友参考一下 我们看一个HTML5页面中通过AJAX请求的方式获取HTTP服务器返回数据的代码示例.由于我们把服务器的端口指定为1337,并将从端口为80的网站中运行HTML5页面,因此这是一种跨域操作,需要在HTTP响应头部中添加Acces

  • 在 C# 中,可以使用 this 关键字来表示当前对象,日常开发中我们可以使用 this 关键字来访问类中的成员属性以及函数。不仅如此 this 关键字还有一些其它的用法,下面就通过一些示例来分别演示一下。 1) 使用 this 表示当前类的对象 运行结果如下: 小牛知识库 https://www.xnip.cn/ 2) 使用 this 关键字串联构造函数 运行结果如下: 无参构造函数 小牛知识库

  • 主要内容:this.属性名,this.方法名,this( )访问构造方法this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。 下面我们根据示例分别讲解 this 关键字的作用。 this.属性名 大部分时候,普通方法访问其他方法、成员变量时无须使用 this 前缀,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀

  • 我有以下电话: 和以下路线: 我试图在'//get Hello'上获取名为'Hello'的参数。我尝试使用req.params,但它返回{}。 调用是否有问题,或者如何获取hello参数?提前谢谢