为什么存储在变量中的JSX代码从不渲染?

问题描述

理想情况下,该代码应检查用户是否已登录应用程序,如果是,请导航至主屏幕,否则,该屏幕应显示包含登录按钮和注册按钮的组件。

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

const LoadingScreen = (props) => {
  let content = <ActivityIndicator />;
  useEffect(() => {
    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;

当用户未登录时,活动指示器将加载,但welcomeButtons组件将永远不会呈现。另外,当用户未登录时,“用户未登录”将两次登录到控制台。

解决方法

您正在异步将组件设置为变量,因此当组件返回JSX表达式时,内容仍包含<ActivityIndicator />元素。要实现此行为,您应该创建一个状态变量,并根据其值返回JSX,就像这样

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

const LoadingScreen = (props) => {
  let content = <ActivityIndicator />;
  const [signedIn,setSignedIn] = useState(false); //false is the default value

  useEffect(() => {
    Firebase.auth().onAuthStateChanged(function (user) {
      if (user) {
        console.log("User Signed in");
        props.navigation.navigate("Home");
        setSignedIn(false);
      } else {
        setSignedIn(true);
        console.log("User not signed in");
      }
    });
  });

  if (signedIn) {
    content = (
      <WelcomeButtons
        onSignUpPress={() => props.navigation.navigate("Register")}
        onSignInPress={() => props.navigation.navigate("Login")}
      />
    );
  }
  return <View>{content}</View>;
};

export default LoadingScreen;

要了解有关状态的更多信息,可以在此处查看React的官方文档:

https://reactjs.org/docs/state-and-lifecycle.html

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...