我有一个小应用程序正在回应,我需要检查用户在离开页面后是否仍然通过身份验证。但我的解决方案不起作用。
我认为我在 useEffect 部分做的不好。因为我在第一次渲染时没有用户。
这是一个好的解决方案还是可以以更好/不同的方式完成?
感谢您的任何建议。
登录页面 - 处理登录
const handleLogin = async (e: React.FormEvent) => {
e.preventDefault(); try { if (!username || !password) { setError('Pole musí byt vyplněna!'); return;
}
const userData = await axios.post( `${process.env.REACT_APP_BACKEND_URL}/account/login`,
{
username,
password,
}
);
if (!userData) { throw new Error();
}
setUser(userData.data); localStorage.setItem('token', userData.data.token); navigate(state?.path || '/home');
} catch (err: any) { setError('Nesprávné jméno nebo heslo!');
}
};应用程序.ts
function App() { const [user, setUser] = useState({ name: '', role: '', username: '',
});
useEffect(() => { const checkUser = async () => { const token = localStorage.getItem('token'); if (token !== null) { const userData = await axios.get( `${process.env.REACT_APP_BACKEND_URL}/account/checkToken`,
{
headers: { Authorization: `Bearer ${token}`,
},
}
);
setUser({ name: `${userData.data.firstname} ${userData.data.lastname}`, role: userData.data.role, username: userData.data.username,
});
}
};
checkUser().catch((err) => console.log(err));
}, []);
return ( <>
<Route path="/" element={}>Route>
<Route
path="/home"
element={
ProtectedRoute>
}
/> <Route
path="stazky"
element={
ProtectedRoute>
}
/> <Route
path="zamestnanci"
element={
ProtectedRoute>
}
/> <Route
path="newZam"
element={
ProtectedRoute>
}
/> <Route
path="zam/:id"
element={
ProtectedRoute>
}
/> <Route
path="new"
element={
ProtectedRoute>
}
/> <Route
path="vozidla"
element={
ProtectedRoute>
}
/> <Route
path="newVehicle"
element={
ProtectedRoute>
}
/> <Route
path="*"
element={
ProtectedRoute>
}
/> Routes>
UserContext.Provider>
</>
);}ProtectedRoute.ts
const ProtectedRoute: React.FC= ({ children }) => { const location = useLocation(); const { user } = useContext(UserContext); const isAuth = !!user.username;
return isAuth ? ( {children}Layout>
) : (
);};export default ProtectedRoute;uj5u.com热心网友回复:
我终于想通了怎么做。
唯一需要的是将“加载状态”添加到背景关系中。如果其他人正在为此苦苦挣扎,我会发布我的代码以供参考。
受保护的路由
const ProtectedRoute: React.FC= ({ children }) => { const location = useLocation(); const { user, loading } = useContext(UserContext); const isAuth = !!user.username;
if (loading) { return Loading..h1>;
}
return isAuth ? ( {children}Layout>
) : (
);};应用程序.js
function App() { const [user, setUser] = useState({ name: '', role: '', username: '',
});
const [loading, setLoading] = useState(true);
useEffect(() => { const checkUser = async () => { const token = localStorage.getItem('token'); if (token !== null) { const userData = await axios.get( `${process.env.REACT_APP_BACKEND_URL}/account/checkToken`,
{
headers: { Authorization: `Bearer ${token}`,
},
}
);
localStorage.setItem('token', userData.data.token); setUser({ name: `${userData.data.firstname} ${userData.data.lastname}`, role: userData.data.role, username: userData.data.username,
});
setLoading(false);
}
};
checkUser();
}, []);
return ( <>
<Route path="/" element={}>Route>
<Route
path="/home"
element={
ProtectedRoute>
}
/> <Route
path="stazky"
element={
ProtectedRoute>
}
/> Routes>
UserContext.Provider>
</>
);}语境
interface IContent { loading: boolean; user: ICurrentUser; setUser: (user: ICurrentUser) => void;}export const UserContext = createContext({ user: { name: '', role: '', username: '',
},
setUser: () => {}, loading: true,});
0 评论