【问题标题】:this.setState() is not a function when using react with jquery inside componentDidmount [duplicate]this.setState() 在 componentDidmount [重复] 中与 jquery 一起使用时不是一个函数
【发布时间】:2016-10-27 19:07:18
【问题描述】:

当我对 es6 和 jquery 的 ajax 函数使用 react 时,我得到了this.setState() is not a function 错误。我尝试使用this.componentDidmount = this.componentDidmount.bind(this); 在构造函数中绑定它,但仍然无法正常工作。

谁能帮帮我?谢谢!

这是我的代码:

import React from 'react';
import $ from 'jquery';

class UserGist extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      userName: '',
      lastGistUrl: ''
    };
  }

  componentDidMount() {
    this.serverRequest = $.get(this.props.source, function(result) {
      let lastGist = result[0];
      this.setState({
        userName: lastGist.owner.login,
        lastGistUrl: lastGist.html_url
      });
    });
  }

  componentWillUnmount() {
    this.serverRequest.abort();
  }

  render() {
    return(
      <div>
        {this.state.userName}'s last gist is
        <a href={this.state.lastGistUrl}>here</a>.
      </div>
    )
  }
}

export default UserGist;

【问题讨论】:

    标签: jquery reactjs ecmascript-6 this


    【解决方案1】:

    componentDidMount() 内的回调函数的 this 上下文未设置。

    您可以使用箭头函数来执行此操作,如下所示:

    this.serverRequest = $.get(this.props.source, (result) => {
      let lastGist = result[0];
      this.setState({
        userName: lastGist.owner.login,
        lastGistUrl: lastGist.html_url
      });
    })
    

    【讨论】:

    • 当我删除this.componentDidMount = this.componentDidMount.bind(this); this.componentWillUnmount = this.componentWillUnmount.bind(this);时,它也可以,这两个函数是否自动绑定this?
    • 是的,所有 React 生命周期方法都是自动绑定的。您遇到的问题是您尝试在异步代码中使用“this” - 一个回调函数。有关说明,请参阅stackoverflow.com/a/20279485/3979621。
    • @freddy: “是的,所有 React 生命周期方法都是自动绑定的。” 不,React.createClass 做到了,但 class 不会发生这种情况语法。
    • @FelixKling 啊,是的,你是对的。但是,您能否举一个例子,当同步使用时,生命周期方法中的this 不会引用包含该方法的类的实例?
    • @freddy:没有。在生命周期方法中,this 将始终引用 React 组件。
    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 2016-01-27
    • 2018-09-22
    • 2015-09-11
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多