TypeError:无法读取未定义的属性“setState”

Posted

技术标签:

【中文标题】TypeError:无法读取未定义的属性“setState”【英文标题】:TypeError: Cannot read property 'setState' of undefined 【发布时间】:2017-10-30 15:06:45 【问题描述】:

我正在尝试在 ajax 回调从 REST api 接收数据后设置组件的状态。这是我的组件构造函数代码

constructor(props) 
    super(props);
    this.state =  posts: [] ;
    this.getPosts = this.getPosts.bind(this);

然后我有一个componentDidMount 方法,如下所示。

componentDidMount() 
        this.getPosts();

现在这是我正在执行 ajax 请求的 getPosts 函数。

getPosts = () =>  
    $.ajax(
        type: 'get',
        url: urlname,
        success: function(data) 
            this.setState(  posts: data  )
        
    );

我想设置状态,但出现以下错误。

this.setState is not a function

不确定是什么原因造成的。如果有人指出我正确的方向,那将非常有帮助。提前致谢。

【问题讨论】:

【参考方案1】:

还要绑定回调函数,使回调中的this 指向 React 组件的上下文,而不是回调函数

getPosts = () =>  
    $.ajax(
        type: 'get',
        url: urlname,
        success: (data) => 
            this.setState(  posts: data  )
        
    );

或者你可以使用 bind like

getPosts = () =>  
    $.ajax(
        type: 'get',
        url: urlname,
        success: function(data) 
            this.setState( posts: data )
        .bind(this)
    );

【讨论】:

没问题,很高兴能帮上忙。这是大多数人常犯的错误。我会建议您在以后遇到此类错误时检查绑定【参考方案2】:

该问题与丢失 this 的上下文有关。 请试试这个:

let self = this;
getPosts = () =>  
    $.ajax(
        type: 'get',
        url: urlname,
        success: function(data) 
            self.setState(  posts: data  )
        
    );

或者你可以使用绑定:

getPosts = () =>  
        $.ajax(
            type: 'get',
            url: urlname,
            success: function(data) 
                self.setState(  posts: data  )
            
        );
    .bind(this)

【讨论】:

【参考方案3】:

您必须将上下文存储到变量中,因为“this”引用在回调中不可用。尝试以下解决方案:

getPosts = () =>  
let that=this;
    $.ajax(
        type: 'get',
        url: urlname,
        success: function(data) 
            that.setState(  posts: data  )
        
    );

【讨论】:

以上是关于TypeError:无法读取未定义的属性“setState”的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取未定义的属性“findAll”(expressjs)

TypeError:无法读取未定义的属性(读取“问题”)

TypeError:无法读取未定义的属性“babel”

TypeError:无法读取未定义的属性(读取“匹配”):

TypeError:无法读取未定义的属性“存在”

TypeError:无法在 gitlab 中读取未定义的属性(读取“读取”)