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

Reactjs 未处理的JS异常:this.setState不是函数,reactjs,react-native,Reactjs,React Native,我是一个新的本地人,遇到一个错误“this.setState不是函数”。请帮我弄清楚这件事 constructor(props) { super(props); this.facebookLogin = this.facebookLogin.bind(this); this.state = { ready: false, email:'', name:'' } } facebookLogin = ()

我是一个新的本地人,遇到一个错误“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})**


使用FACEBOOK登录

谢谢。

每次您声明像
function(){}
这样的函数时,它都会创建一个新的作用域,因此当您到达setState时,
这个
不再是您的组件


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

每次您声明一个类似
函数(){}
的函数时,它都会创建一个新的作用域,因此在您开始设置state时,
不再是您的组件


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

设置您尝试访问的状态在您的类作用域中可用。但是,您正在由您的某个操作调用的函数范围中调用setstate。作为问题的解决方案,您需要将其与onpress操作中的函数绑定在一起,即this.facebooklogin.bind(this)。这样,您就可以在函数中访问此类作用域。您可以将其存储在函数中的另一个变量中,并使用该变量调用setState


或者,您可以使用ES6 arrow函数来解决此问题。

您试图访问的设置状态在您的类范围内可用。但是,您正在由您的某个操作调用的函数范围中调用setstate。作为问题的解决方案,您需要将其与onpress操作中的函数绑定在一起,即this.facebooklogin.bind(this)。这样,您就可以在函数中访问此类作用域。您可以将其存储在函数中的另一个变量中,并使用该变量调用setState


或者,您可以使用ES6 arrow函数来解决此问题。

嘿,您的代码似乎缺少类声明。你能加上它吗?我假设第二段代码是渲染函数的一部分?facebookLogin是构造函数创建的类的一部分吗?你能编辑你的问题使其更清晰吗?调用this.setState的确切位置?this.setState在回调函数(错误,结果){}的内部调用。。。。将其替换为(error,result)=>{….},或者将其移动到构造函数内部绑定的单独方法中。您的代码似乎缺少类声明。你能加上它吗?我假设第二段代码是渲染函数的一部分?facebookLogin是构造函数创建的类的一部分吗?你能编辑你的问题使其更清晰吗?调用this.setState的确切位置?this.setState在回调函数(错误,结果){}的内部调用。。。。将其替换为(error,result)=>{….},或将其移动到构造函数内绑定(this)的单独方法
<TouchableOpacity style={styles.btnfb} 
                     onPress={this.facebookLogin}>
             <Text  style={styles.buttonText}>LOGIN WITH FACEBOOK</Text>

</TouchableOpacity>