嗨,我对ReactJS还是新手,我刚刚开始使用Firebase,目前我正在学习一个教程;我面临的问题是,每次我刷新页面时,我都会返回到页面中的标记,我还创建了受保护的路径来检查用户是否登录了,但事实并非如此,因为我一直在调整onAuthStateChange(),看看它是否没有在手前开火,但我仍然被困在了兔子洞里。
“注意到我正在使用firebase v9"
我的userAuth()上下文
import { createContext, useContext, useEffect, useState } from "react";
import { auth } from '../config/firebase';
import {
createUserWithEmailAndPassword,
signInWithEmailAndPassword,
signOut,
onAuthStateChanged,
confirmPasswordReset,
sendPasswordResetEmail,
GoogleAuthProvider,
signInWithPopup
} from 'firebase/auth';
const userAuthContext = createContext();
export function UserAuthContextProvider({children}){
const [user, setUser] = useState(null);
function signUp(email, password){
return createUserWithEmailAndPassword(auth, email, password);
}
function signIn(email, password){
return signInWithEmailAndPassword(auth, email, password);
}
function googleSignIn(){
const provider = new GoogleAuthProvider();
return signInWithPopup(auth, provider)
}
function logOut(){
return signOut(auth);
}
function forgotPassword(email){
return sendPasswordResetEmail(auth, email, {url:'http://localhost:3000/signin'});
}
function resetPassword(oobCode, newPassword){
return confirmPasswordReset(auth, oobCode, newPassword);
}
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (currentUser) => {
setUser(currentUser);
})
return () => {
unsubscribe();
}
},[]);
return (
<userAuthContext.Provider value={{
user,
signIn,
googleSignIn,
signUp,
logOut,
forgotPassword,
resetPassword}}
>
{children}
</userAuthContext.Provider>
)
}
export function UserAuth(){
return useContext(userAuthContext);
}我的保护之路
import { Redirect, Route } from "react-router-dom";
import { UserAuth } from "../../context/userAuth";
const ProtectedRoute = ({component: Component, ...rest}) => {
const {user} = UserAuth();
return (
<Route
{...rest}
render={(props) =>
user ? (
<Component {...props}/>
):(
<Redirect to="/signin"/>
)
}
/>
)
}
export default ProtectedRoute我用UserAuthContextProvider包了index.js
ReactDOM.render(
<UserAuthContextProvider>
<App />
</UserAuthContextProvider>,
document.getElementById('root')
);发布于 2022-03-11 13:08:35
这是正常的,当你刷新页面时,你失去了应用程序的状态。使用localstorage存储user。
useEffect(() => {
let unsubscribe;
const user = localStorage.getItem('user'); // <=== save the state in localStorage
if (user) {
setUser(JSON.parse(user));
} else {
unsubscribe = onAuthStateChanged(auth, (currentUser) => {
setUser(currentUser);
localStorage.setItem('user', JSON.stringify(user));
});
}
return () => {
if(unsubscribe) unsubscribe();
};
}, []);https://stackoverflow.com/questions/71438773
复制相似问题