开发者问题收集

返回错误无法读取未定义的 reactjs 的属性“setstate”

2018-10-11
308

为什么我不能将状态设置为我已经在状态中定义的状态变量,我也尝试将状态设置为 this.state.propval = response.data

状态声明,

constructor(props) {
        super(props);
        this.state = {
     propval:null,
        };
    }

发送axios请求并在此处获取响应。

 axios.post('/eventcreate/createevent', data)
    .then(function (response) {
      alert(response.data)
      var result = response.data
      console.log("result out :"+result)
      this.setState({propval : result})
      this.propfun(response.data)
      self.forceUpdate()
    })

但出现错误

Unhandled Rejection (TypeError): Cannot read property 'setState' of undefined
(anonymous function)
src/components/forms/neweventcreation.js:306
  303 | alert(response.data)
  304 | var result = response.data
  305 | console.log("result out :"+result)
> 306 | this.setState({propval : result})
  307 | 
  308 | this.propfun(response.data)
  309 | self.forceUpdate()

请帮我解决这个问题。

3个回答

这不起作用,因为 this 在 axios 内部是不同的。axios 中的 this 指的是 axios 对象,而不是您的 React 组件。

如果您使用 ES6,您可能想要使用箭头函数(它们没有自己的 this )。 了解更多信息

 axios.post('/eventcreate/createevent', data)
    .then((response) => {
      alert(response.data)
      var result = response.data
      console.log("result out :"+result)
      this.setState({propval : result})
      this.propfun(response.data)
      self.forceUpdate()
    })

如果您不使用 ES6,您可以这样做:

var self = this;
axios.post('/eventcreate/createevent', data)
   .then(function (response) {
   ...
   self.setState({propval : result})
   ...
})
Ahsan Ali
2018-10-11

你有一个范围问题。 axios.then() 中的 this 引用本地范围。

似乎你已经用变量 self 添加了全局引用

试试这个

let that = this; //global scope
axios.post('/eventcreate/createevent', data)
.then(function (response) {
  //this referes to the current function scope.
  alert(response.data)
  var result = response.data
  console.log("result out :"+result)
  that.setState({propval : result}) // or self.setState({propval : result})
  that.propfun(response.data)  //or self.propfun(response.data) 
  self.forceUpdate()
})

阅读本文以了解更多 javascript 范围

Tiisetso Tjabane
2018-10-11

我认为您需要绑定已完成 axios 后调用的函数。或者您可以将该函数设为匿名函数。例如:

postData(){
   .... axios call
}

变为

postData = () => {
     ... axios call
}
Nikhil Pathania
2018-10-11