我是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>
谢谢。
答案 0 :(得分:3)
每次声明类似function () {}
之类的函数时,它都会创建一个新的作用域,因此,到了setState时,this
不再是您的组件。
一种快速解决方案是使用箭头函数:() => {}
,因为它保留了作用域,或者将this
从外部作用域通过变量传递到需要的地方。
答案 1 :(得分:1)
setState在类范围中可用。但是,您在函数作用域中调用setstate,而函数作用域由您的某些操作调用。为了解决您的问题,您需要将此功能与onpress操作中的功能绑定在一起,即this.facebooklogin.bind(this)。因此,通过这种方式,您可以在函数中访问类范围。您可以将其存储在函数中的另一个变量中,然后使用该变量来调用setState。
或者,您可以使用ES6箭头功能来解决此问题。