我正在尝试将“loading”的状态从true更改为false但是当我调用一个函数并在该函数设置中“this.setState({loading:false})”时,仍然加载状态仍然为真。
在下面的代码中,当调用buttonPressed函数时,它正在按预期将“loading”状态设置为true,但是当用户成功登录“loading”状态时应该变为false,这样我的renderButton函数将重新渲染并且spinner可以隐藏本身和显示按钮。
为什么“加载”状态在loginSuccess函数中没有变为false?
random.choice
更新-------
这是成功登录后的控制台输出,登录前没有输出
答案 0 :(得分:3)
正如Hunaid Hassan所说,你没有执行函数this.onLoginSuccess.bind(this)
,你可以在构造函数中绑定或使用箭头函数来避免绑定(见下面的代码)。
onLoginSuccess = () => {
this.setState({
email: '',
password: '',
errorMessage: '',
loading: false,
}, () => { console.log(this.state.loading) }); // callback function to be called after state is updated
this.props.buttonPress; // this function isn't executed do this.props.buttonPress() instead
}
答案 1 :(得分:2)
this.onLoginSuccess.bind(this);
此行实际上不会调用该函数。
将this.onLoginSuccess = this.onLoginSuccess.bind(this);
放入构造函数中,然后在firebase auth回调中调用此函数this.onLoginSuccess()
。
答案 2 :(得分:2)
在@Hunaid-Hassan的回答之上:
onLoginSuccess = () => {//making it arrow will let you avoid using bind
this.setState(() => ({
email: '',
password: '',
errorMessage: '',
loading: false
}));
this.props.buttonPress;//<-what is it? do you meant to call it? this.props.buttonPress();
}