如何修复三元导航中呈现的两个页面 return
How fix two pages render in ternary navigation return
我正在尝试实现持久登录会话以与 firebase 做出反应,它工作得很好,但我在初始状态和组件的重新呈现方面有问题, currentUser
它是 null
然后来自 useAuth
组件的 useEffect 呈现并检查它是否是登录用户,并将 currentUser
设置为真实值。
useAuth 组件:
useEffect(() => {
console.log("Rerendered useAuth");
const unsubscribe = onAuthStateChanged(auth, (user) => {
if (user) {
console.log("We are authenticated now!");
setCurrentUser(user);
} else {
console.log("The user is not logged!");
setCurrentUser(null);
}
});
// Cleanup subscription on unmount
return () => unsubscribe();
}, []);
导航中的三元return:
function MainNavigator() {
const { currentUser } = useAuth();
const Stack = createNativeStackNavigator();
return (
<Stack.Navigator
screenOptions={{ headerShown: false }}
initialRouteName={RoutesEnum.landing}
>
{currentUser ? ( // null at first, then truthy
<>
<Stack.Screen
name={RoutesEnum.tabNavigator}
component={TabNavigator}
/>
<Stack.Screen name={RoutesEnum.stories} component={Stories} />
</>
) : (
<>
<Stack.Screen name={RoutesEnum.landing} component={Landing} />
<Stack.Screen name={RoutesEnum.login} component={Login} />
<Stack.Screen name={RoutesEnum.register} component={Register} />
<Stack.Screen name={RoutesEnum.myAccount} component={MyAccount} />
<Stack.Screen
name={RoutesEnum.forgotPassword}
component={ResetPassword}
/>
</>
)}
</Stack.Navigator>
);
}
问题:
首先呈现登录页面(几毫秒),因为初始状态是 null
,然后呈现 useAuth 并使用 useEffect 记录用户,然后导航到主页。
我该如何解决这个渲染两个屏幕的问题
检查您的“useAuth”挂钩 returns 是否是 loading
道具,通常应该如此。然后你会得到这样的东西:
const { currentUser, loading } = useAuth();
const Stack = createNativeStackNavigator();
if (loading) return null;
return (
// ... rest of your code
你也可以if (loading) return <LoadingPage/>
如果你构建一个这样的组件
我正在尝试实现持久登录会话以与 firebase 做出反应,它工作得很好,但我在初始状态和组件的重新呈现方面有问题, currentUser
它是 null
然后来自 useAuth
组件的 useEffect 呈现并检查它是否是登录用户,并将 currentUser
设置为真实值。
useAuth 组件:
useEffect(() => {
console.log("Rerendered useAuth");
const unsubscribe = onAuthStateChanged(auth, (user) => {
if (user) {
console.log("We are authenticated now!");
setCurrentUser(user);
} else {
console.log("The user is not logged!");
setCurrentUser(null);
}
});
// Cleanup subscription on unmount
return () => unsubscribe();
}, []);
导航中的三元return:
function MainNavigator() {
const { currentUser } = useAuth();
const Stack = createNativeStackNavigator();
return (
<Stack.Navigator
screenOptions={{ headerShown: false }}
initialRouteName={RoutesEnum.landing}
>
{currentUser ? ( // null at first, then truthy
<>
<Stack.Screen
name={RoutesEnum.tabNavigator}
component={TabNavigator}
/>
<Stack.Screen name={RoutesEnum.stories} component={Stories} />
</>
) : (
<>
<Stack.Screen name={RoutesEnum.landing} component={Landing} />
<Stack.Screen name={RoutesEnum.login} component={Login} />
<Stack.Screen name={RoutesEnum.register} component={Register} />
<Stack.Screen name={RoutesEnum.myAccount} component={MyAccount} />
<Stack.Screen
name={RoutesEnum.forgotPassword}
component={ResetPassword}
/>
</>
)}
</Stack.Navigator>
);
}
问题:
首先呈现登录页面(几毫秒),因为初始状态是 null
,然后呈现 useAuth 并使用 useEffect 记录用户,然后导航到主页。
我该如何解决这个渲染两个屏幕的问题
检查您的“useAuth”挂钩 returns 是否是 loading
道具,通常应该如此。然后你会得到这样的东西:
const { currentUser, loading } = useAuth();
const Stack = createNativeStackNavigator();
if (loading) return null;
return (
// ... rest of your code
你也可以if (loading) return <LoadingPage/>
如果你构建一个这样的组件