当前位置: 首页 > 知识库问答 >
问题:

React-Native:状态不是用setState更新?

阎修杰
2023-03-14

我试图将“加载”的状态从true更改为false,但当我调用一个函数并在该函数中设置“this.setState({loading:false})”时,加载状态仍然保持true。

在下面的代码中,当按钮按钮函数被调用时,它将“加载”状态设置为真,但当用户成功登录“加载”状态时,应该变为假,这样我的渲染按钮函数将重新渲染,旋转器可以隐藏自己并显示按钮。

为什么LoginSAccess函数中的“加载”状态没有变为false?

class Login extends Component {
    constructor(props){
        super(props);
        this.state = {
            name: '',
            email: '',
            password: '',
            errorMessage: '',
            loading: false,
        };
    }
    //after successfully login with email and password
    onLoginSuccess(){
        this.setState({
            email: '',
            password: '',
            errorMessage: '',
        });
        this.setState({loading: false});
        this.props.buttonPress;
    }
    
    // to render either button or spinner
    renderButton(){
        if(this.state.loading){
            return <Spinner />;
        }else{
            return (
                <TouchableOpacity style={styles.button} onPress={this.buttonPressed.bind(this)} >
                    <Text style={styles.buttonText}>{this.props.userAction}</Text>
                </TouchableOpacity>
            );
        }
    }
    
    //setting loading state to true and authenticating user
    buttonPressed(){
        const { name, email, password, loading } = this.state;

        this.setState({errorMessage: '', loading: true});

        if(this.props.userAction==='Login'){
            firebase.auth().signInWithEmailAndPassword(email, password)
                .then(()=>{
                    console.log("sign in");
                    this.onLoginSuccess.bind(this);
                    console.log(this.state.loading); // to get current state at console
                })
                .catch((error) => {
                    let errorCode = error.code;
                    if(errorCode==='auth/user-not-found'){
                        console.log(this.state.errorMessage+' user not found');
                        this.setState({errorMessage: 'authentication failed'});
                    }else if(errorCode==='auth/wrong-password'){
                        console.log(this.state.errorMessage+' wrong password');
                        this.setState({errorMessage: 'authentication failed'});
                    }else{
                        console.log(this.state.errorMessage);
                        this.setState({errorMessage: 'authentication failed'});
                    }
                });
        }
        //User Sign Up
        else{
            firebase.auth().createUserWithEmailAndPassword(email, password);
        }
        
    }

    render(){
        return (
            <View style={styles.container}>
                
                <Input 
                    placeholder="Email" 
                    keyboardType="email-address"
                    value={this.state.email}
                    onChangeText={(email)=> this.setState({email})}
                />
                <Input 
                    placeholder="Password" 
                    keyboardType="default"   
                    secureTextEntry={true}
                    value={this.state.password}
                    onChangeText={(password)=> this.setState({password})}
                />
                {this.renderButton()}
                <Text>{this.state.errorMessage}</Text>
            </View>
        );
    }
}

export default Login;

更新-------

这是成功登录后的控制台输出,登录前没有输出

共有3个答案

万高畅
2023-03-14

在@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();
}
幸乐湛
2023-03-14

this.onloginsucess.bind(this) 此行实际上不会调用函数。

this.onLogin成功=this.onLoginSuccess.bind(this);放入构造函数中,然后在Firebase auth回调中调用这样的函数this.onLogin成功()

宁弘亮
2023-03-14

正如Hunaid Hassan所说,您不是在执行函数this.onloginsucess.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
}
 类似资料:
  • 所以我有这个: 只是一个数组的数字例如然而没有给出正确的总数,但?我甚至放了一个超时延迟,看看这是否解决了问题。任何明显的还是我应该发布更多的代码?

  • 本文向大家介绍react-native setState,包括了react-native setState的使用技巧和注意事项,需要的朋友参考一下 示例 要在应用程序中更改视图,可以使用setState-这将重新渲染您的组件及其任何子组件。setState在新状态和先前状态之间执行浅表合并,并触发组件的重新呈现。 setState 接受键值对象或返回键值对象的函数 键值对象 功能 使用函数对于基于

  • 问题内容: 所以我有这个: newDealersDeckTotal只是一个数字数组,例如,但是没有给出正确的总数,但是呢?我什至设置了超时延迟,以查看是否可以解决问题。任何明显的还是我应该发布更多代码? 问题答案: 通常是异步的,这意味着在您处于状态时,它尚未更新。尝试将日志放入方法的回调中。状态更改完成后执行:

  • 我正在从一个文件导出常量并将其导入另一个文件,如下所示: 常数.js App.js 我希望我的初始状态是在构造函数中设置的,然后在componentWillMount上,我希望使用常量文件中的值设置状态,然后再围绕组件和流添加进一步的逻辑。 但是,我发现,我的状态没有被更新,如果我在调用setState之后记录控制台日志,状态仍然没有定义,如果我引入一个方法,需要state中的值,那么在执行堆栈的

  • 我想问一下,为什么在执行事件时,我的状态没有改变。我已经搜索到需要在构造函数中绑定函数,但是状态仍然没有更新。 下面是我的代码:

  • 问题内容: 我想问为什么在执行onclick事件时状态没有变化。我已经搜索了一段时间,我需要在构造函数中绑定onclick函数,但状态仍未更新。这是我的代码: 问题答案: 这个回调真的很混乱。只需使用async await代替: