未处理的JS异常:this.setState不是函数

时间:2018-12-08 18:48:03

标签: reactjs react-native

我是React Native的新手,并且收到错误消息“ this.setState不是函数”。请帮我解决这个问题。

    constructor(props) {
    super(props);
    this.facebookLogin = this.facebookLogin.bind(this);
    this.state = {
        ready: false,
        email:'',
       name:''
      }
}


facebookLogin = () =>{
      LoginManager.logInWithReadPermissions(['public_profile','email']).then(function(result){
        if(result.isCancelled){
            console.log('loging cancelled')
        }
        else {
            console.log('login success' + result.grantedPermissions)
            const infoRequest = new GraphRequest('/me', {
                parameters: {
                    'fields': {
                        'string' : 'email,name'
                    }
                }
            },function(error, result) {
              console.log(result)
              if (error) {
                alert('Error fetching data: ' + error.toString());
              } else {
                this.setState({name: result.name, email:result.email});
              }});
            new GraphRequestManager().addRequest(infoRequest).start();
        }
    }, function(error){
        console.log('An error occured: ' + error)
    })
    }

** this.setState({name:result.name,email:result.email}); **

<TouchableOpacity style={styles.btnfb} 
                     onPress={this.facebookLogin}>
             <Text  style={styles.buttonText}>LOGIN WITH FACEBOOK</Text>

</TouchableOpacity> 

谢谢。

2 个答案:

答案 0 :(得分:3)

每次声明类似function () {}之类的函数时,它都会创建一个新的作用域,因此,到了setState时,this不再是您的组件。

一种快速解决方案是使用箭头函数:() => {},因为它保留了作用域,或者将this从外部作用域通过变量传递到需要的地方。

答案 1 :(得分:1)

您尝试访问的

setState在类范围中可用。但是,您在函数作用域中调用setstate,而函数作用域由您的某些操作调用。为了解决您的问题,您需要将此功能与onpress操作中的功能绑定在一起,即this.facebooklogin.bind(this)。因此,通过这种方式,您可以在函数中访问类范围。您可以将其存储在函数中的另一个变量中,然后使用该变量来调用setState。

或者,您可以使用ES6箭头功能来解决此问题。