这里展示了Reaction-RouterV6中最基本的身份验证实现.PrivateRoutes
中的loggedIn
标志在更新上下文后更新为真时不会改变,因此当导航到私有路由时不能访问它们.为什么会这样呢?
import './App.css';
import {
BrowserRouter,
Navigate,
Outlet,
Route,
Routes,
useNavigate
} from 'react-router-dom';
import React, { useState } from 'react';
function App() {
return (
<div>
<AuthProvider>
<BrowserRouter>
<Routes>
<Route path="/" element={<HomePage />} />
<Route element={<PrivateRoutes />}>
<Route path="/secret" element={<SecretPage />} />
{/** ... Other protected pages ...*/}
</Route>
</Routes>
</BrowserRouter>
</AuthProvider>
</div>
);
}
function PrivateRoutes() {
const { loggedIn } = useAuth();
return loggedIn ? <Outlet />: <Navigate to="/" />
}
function HomePage() {
const navigate = useNavigate();
return <>
<h1>Home page</h1>
<button onClick={() => navigate('/secret')}>
Go to secret page
</button>
</>
}
function SecretPage() {
return <>
<h1>Secret Page</h1>
</>
}
const AuthContext = React.createContext()
const AuthProvider = ({ children }) => {
const { loggedIn, signIn } = useAuth()
return
<AuthContext.Provider value={loggedIn}>
{/**
* Button to trigger sign in and showing the
* current status.
*/}
<button onClick={signIn}>LogIn</button>
<h2>Logged In: {loggedIn.toString()}</h2>
<p>-----------------------</p>
{children}
</AuthContext.Provider>
}
const useAuth = () => {
const [loggedIn, setLoggedIn] = useState(false)
const signIn = () => {
{/** sign in logic ....*/}
setLoggedIn(true);
};
return { loggedIn, signIn };
}
export default App;