将 JSX 代码存储在变量中并渲染它?

Storing JSX code in a variable and rendering it?

我正在创建一个欢迎屏幕,用户可以在其中决定是要登录还是注册。使用 Firebase 的 onAuthStateChanged,我可以检查用户是否已经在此应用程序上签名(此“是否已登录”状态的持久性是本地的:即使用户在未注销的情况下关闭应用程序,他们仍将处于登录状态)。

我只想自动将用户导航到主屏幕(在我的 stackNavigator 中),如果他们已经登录而不呈现(或显示)任何东西。我该怎么做?

因为我是初学者,所以我首先想到的是有条件地执行此操作:屏幕返回的内容将存储在名为 content 的变量中,默认情况下为 null。如果用户登录(由 onAuthStateChanged 块测试),它将自动导航到主屏幕。如果用户未登录,则内容将是一个 JSX 组件(包含两个按钮:一个用于注册,一个用于登录。这些按钮都导航到相应的屏幕)

到目前为止这还没有奏效,我的屏幕只是空白。我的代码如下:


import React, { useEffect } from 'react';
import { View} from 'react-native';
import WelcomeButtons from "../components/welcomeButtons";
import Firebase from "../fireConfig"

const LoadingScreen = props => {
  let content = null;
  Firebase.auth().onAuthStateChanged(function(user) {
    if (user) {
      console.log("User Signed in")

      props.navigation.navigate("Home");
    }else{
      content = (<WelcomeButtons onSignUpPress = {() => props.navigation.navigate("Register")}
      onSignInPress = {() => props.navigation.navigate("Login")}/>);
      console.log("User not signed in")
    }
  });
  
  
    
    return(
      <View>
      {content}
      </View>
    );
}


export default LoadingScreen;

欢迎任何方法,如果用户在任何呈现之前(或至少在显示任何内容之前)登录,我只需要导航到主屏幕

Firebase.auth().onAuthStateChanged 是异步函数,它需要很少的时间来 return 响应,但 LoadingScreen return 立即响应,这就是它显示空白屏幕的原因。 所以,这是解决方案

import React, { useEffect, useState } from 'react';
import { View,ActivityIndicator} from 'react-native';
import WelcomeButtons from "../components/welcomeButtons";
import Firebase from "../fireConfig"

const LoadingScreen = props => {
const [loading, setLoading] = useState(true);
let content = <ActivityIndicator />;
useEffect(() => {
Firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
          setLoading(false);
          console.log("User Signed in")
          props.navigation.navigate("Home");
        }else{
          setLoading(false);
          content = (<WelcomeButtons onSignUpPress = {() => 
           props.navigation.navigate("Register")}
          onSignInPress = {() => props.navigation.navigate("Login")}/>);
          console.log("User not signed in")
        }
      });
  });               
return(
      <View>
      {content}
      </View>
    );
    }
export default LoadingScreen;