场景一
在react项目中,路由跳转前需判断是否存在token,有则正常跳转,没有则去登录页面。
实现
这里使用的是localstorage存储token(也可以使用redux管理token)
// src\components\AuthRoute.js
// 封装高阶组件
// 有token正常跳转 无token去登录页
import { Navigate } from 'react-router-dom'
export function AuthRoute({ children }) {
const token = localStorage.getItem('userToken_key')
if (token) {
return <>{ children}</>
} else {
return <Navigate to={'/login'} replace />
}
}
// src\router\index.js
import Login from '../page/Login'
import Layout from '../page/Layout'
import { createBrowserRouter } from 'react-router-dom'
import { AuthRoute } from '../components/AuthRoute'
const router = createBrowserRouter([
{
path: '/login',
element:<Login/>
},
{
path: '/',
element:<AuthRoute><Layout/></AuthRoute>
}
])
export default router
场景二
对于每个axios请求,都需要在header添加上token数据。
实现
为实现上述场景,直接在axios的请求拦截器中写如下代码:
//请求拦截器
instance.interceptors.request.use(
(config) => {
const token=localStorage.getItem('userToken_key')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
(err) => Promise.reject(err)
)
注意:在axios拦截器中无法使用react中的hook(以use开头的函数被称为hook),所以无法使用useSelector拿到store中的token数据。
如果本文对你有帮助,希望能得到你的点赞或收藏或关注,这是对我最好的鼓励;
如你有问题或疑惑,欢迎在评论区写下,必将努力解答;
如本文有误区,希望你不吝赐教,让我们共勉!