PrivateRoute 在我的 Firebase Auth 上下文中闪烁
PrivateRoute Flickering with my Firebase Auth Context
我在使用 AuthContext 时遇到闪烁我的私人路线的问题。以下是我的私人路线的代码:
import React from 'react';
import { Navigate } from 'react-router-dom';
import { UserAuth } from '../../Context/AuthContext';
const PrivateRoute = ({ children }) => {
const { user } = UserAuth();
if (!user) {
return <Navigate to='/login' />;
}
return children;
};
export default PrivateRoute;
没有个人信息显示,因为用户在 Auth Context 中被初始化为 {}。但我仍然可以看到页面和导航栏。有人有解决方案吗?
此外,下面是AuthContext.js:
import { createContext, useContext, useEffect, useState } from 'react';
import {
createUserWithEmailAndPassword,
signInWithEmailAndPassword,
signOut,
onAuthStateChanged,
} from 'firebase/auth';
import { auth } from '../../firebase';
const UserContext = createContext();
export const AuthContextProvider = ({ children }) => {
const [user, setUser] = useState({});
const createUser = (email, password) => {
return createUserWithEmailAndPassword(auth, email, password);
};
const signIn = (email, password) => {
return signInWithEmailAndPassword(auth, email, password)
}
const logout = () => {
return signOut(auth)
}
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (currentUser) => {
//console.log(currentUser);
setUser(currentUser);
});
return () => {
unsubscribe();
};
}, []);
return (
<UserContext.Provider value={{ createUser, user, logout, signIn }}>
{children}
</UserContext.Provider>
);
};
export const UserAuth = () => {
return useContext(UserContext);
};
所以我找到了一个有点厚颜无耻的解决方案。我不会 post 我的解决方案,但基本上,我将 return 语句 return children
包装在 PrivateRoute 函数中,并使用用户对象中特定项目的 if 语句。这可以防止任何 return 和 'solves' 闪烁。
我在使用 AuthContext 时遇到闪烁我的私人路线的问题。以下是我的私人路线的代码:
import React from 'react';
import { Navigate } from 'react-router-dom';
import { UserAuth } from '../../Context/AuthContext';
const PrivateRoute = ({ children }) => {
const { user } = UserAuth();
if (!user) {
return <Navigate to='/login' />;
}
return children;
};
export default PrivateRoute;
没有个人信息显示,因为用户在 Auth Context 中被初始化为 {}。但我仍然可以看到页面和导航栏。有人有解决方案吗?
此外,下面是AuthContext.js:
import { createContext, useContext, useEffect, useState } from 'react';
import {
createUserWithEmailAndPassword,
signInWithEmailAndPassword,
signOut,
onAuthStateChanged,
} from 'firebase/auth';
import { auth } from '../../firebase';
const UserContext = createContext();
export const AuthContextProvider = ({ children }) => {
const [user, setUser] = useState({});
const createUser = (email, password) => {
return createUserWithEmailAndPassword(auth, email, password);
};
const signIn = (email, password) => {
return signInWithEmailAndPassword(auth, email, password)
}
const logout = () => {
return signOut(auth)
}
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (currentUser) => {
//console.log(currentUser);
setUser(currentUser);
});
return () => {
unsubscribe();
};
}, []);
return (
<UserContext.Provider value={{ createUser, user, logout, signIn }}>
{children}
</UserContext.Provider>
);
};
export const UserAuth = () => {
return useContext(UserContext);
};
所以我找到了一个有点厚颜无耻的解决方案。我不会 post 我的解决方案,但基本上,我将 return 语句 return children
包装在 PrivateRoute 函数中,并使用用户对象中特定项目的 if 语句。这可以防止任何 return 和 'solves' 闪烁。