react路由守卫、路由监听等总结
在React中,可以使用react-router-dom
库中的<Route>
组件的render
属性或者component
属性外加高阶组件(HOC)来实现路由守卫。
以下是一个使用react-router-dom
v5版本的简单示例:
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
// 高阶组件用于路由守卫
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route
{...rest}
render={props =>
localStorage.getItem('isLoggedIn') ? (
<Component {...props} />
) : (
<Redirect to="/login" />
)
}
/>
);
// 使用PrivateRoute
function App() {
return (
<div>
<PrivateRoute exact path="/" component={HomePage} />
<Route path="/login" component={LoginPage} />
</div>
);
}
function HomePage() {
return <h1>Home Page</h1>;
}
function LoginPage() {
return <h1>Login Page</h1>;
}
export default App;
在这个例子中,PrivateRoute
是一个高阶组件,它检查localStorage
中的isLoggedIn
项来决定是否重定向用户到登录页面。如果用户已经登录(isLoggedIn
为true
),则渲染HomePage
,否则重定向到/login
路径。
如果你使用的是react-router-dom
v6版本,代码会有一些不同,主要是因为<Route>
组件的API变化:
import React from 'react';
import { Navigate, Route, useLocation } from 'react-router-dom';
function PrivateRoute({ children }) {
let location = useLocation();
return localStorage.getItem('isLoggedIn') ? children : <Navigate to="/login" replace state={{ from: location.pathname }} />;
}
function App() {
return (
<div>
<PrivateRoute path="/">
<HomePage />
</PrivateRoute>
<Route path="/login" element={<LoginPage />} />
</div>
);
}
function HomePage() {
return <h1>Home Page</h1>;
}
function LoginPage() {
return <h1>Login Page</h1>;
}
export default App;
在v6版本中,<Navigate>
组件用于重定向,而useLocation
钩子用于访问当前的location状态。children
属性用于传递需要保护的组件。
评论已关闭