屏幕渲染两次

时间:2018-11-16 20:01:29

标签: react-native

在我的本机应用程序中,我想显示基于状态的屏幕。

Login.js

export default class Login extends Component {
    constructor(props){
        super(props);
        this.state = {
            accessTokenExists: false
        }
    }

     accessvalid = () => {
          tokenStorage.getToken('accesstoken')
        .then(res => {
             fetchTokens.validAccessToken(res)
            .then(res => {
                this.setState({accessTokenExists: true});
                console.log('Existing Accesstoken');
            })
        })
        .catch(err => {
            this.setState({accessTokenExists: false});
            console.log('Not Existing AccesToken');
        })    
    }

    componentWillMount(){
        this.accessvalid();
    };

    componentDidMount() {
        SplashScreen.hide();


    }

    render() {
        if(this.state.accessTokenExists){
            return(<Fingerprint navigation={this.props.navigation}/>)
        } else {
            return(<Password navigation={this.props.navigation}/>)
        }

    }
}

当状态 accesTokenExists true 时,react首先将另一个屏幕渲染一秒钟,然后重新渲染右侧屏幕。

这是因为在我更改 accesvalid 方法的状态之前,API会进行调用。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我相信这是因为您在构造函数中将其设置为false,并且在ComponentWillMount将其设置为true之前需要花费时间。解决此问题的一种方法可能是使用另一个状态变量来呈现加载状态,直到完成检查accessTokenExists为止,该状态变量将指示加载是否完成。顺便说一句,我假设您知道不赞成componentWillMount。

答案 1 :(得分:1)

您的请求是异步的。当您在ComponentWillMount中发出此请求时,它将触发该请求,并且组件将继续呈现。由于默认状态为false,因此<Password navigation={this.props.navigation}/>会呈现。

当返回返回时,如果成功,则将安装另一个组件。您希望将“正在请求”的条件作为组件可能处于处理该状态的状态。