v6升级实战:路由守卫中useNavigate的正确使用方法
在React Router v6的升级过程中,路由守卫的实现方式发生了显著变化。v6不再支持直接在路由配置中使用component属性,而是推荐使用element属性配合组件进行路由渲染。这使得在路由守卫中正确使用useNavigate变得尤为重要。
问题场景
在升级到v6后,许多开发者发现原有的路由守卫逻辑失效,特别是在需要根据用户权限或登录状态进行重定向的场景中。
解决方案
首先,我们需要创建一个自定义的路由守卫组件:
import { useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
const ProtectedRoute = ({ children }) => {
const navigate = useNavigate();
useEffect(() => {
// 检查用户权限或登录状态
const isAuthenticated = checkAuth();
if (!isAuthenticated) {
navigate('/login', { replace: true });
}
}, [navigate]);
return children;
};
const checkAuth = () => {
// 实现你的认证逻辑
return localStorage.getItem('token') !== null;
};
然后在路由配置中使用:
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
const router = createBrowserRouter([
{
path: '/',
element: <ProtectedRoute><Home /></ProtectedRoute>
},
{
path: '/login',
element: <Login />
}
]);
function App() {
return <RouterProvider router={router} />;
}
关键要点
useNavigate必须在组件内部调用,不能在函数组件外部使用- 使用
replace: true避免用户返回到上一个页面 - 在
useEffect中进行权限检查,确保组件挂载后执行 - 通过
element属性传递保护的路由组件
这种实现方式不仅兼容v6的路由体系,还能保证路由守卫的正确性和可维护性。

讨论