v6非组件环境路由跳转
本节目标:
能够在响应拦截器中处理token失效
说明:为了能够在非组件环境下拿到路由信息,需要我们安装一个history包
实现步骤
- 安装history包:
yarn add history
- 创建
utils/history.js
文件 - 在app.js中使用我们新建的路由并配置history参数
- 通过响应拦截器处理 token 失效,如果发现是401调回到登录页
代码实现
utils/history.js
import { createBrowserHistory } from 'history'
import { unstable_HistoryRouter as HistoryRouter } from 'react-router-dom'
const history = createBrowserHistory()
export {
HistoryRouter,
history
}
app.js
import { HistoryRouter, history } from './utils/history'
function App() {
return (
<HistoryRouter history={history}>
...省略无关代码
</HistoryRouter>
)
}
export default App
utils/http.js
import { history } from './history'
http.interceptors.response.use(
response => {
return response.data
},
error => {
if (error.response.status === 401) {
// 删除token
clearToken()
// 跳转到登录页
history.push('/login')
}
return Promise.reject(error)
}
)
v5非组件环境路由跳转
目标:能够统一处理token失效重定向到登录页面
说明:为了能够在非组件环境下拿到路由信息,需要我们自定义 Router 的 history
步骤:
- 安装:yarn add history
- 创建 utils/history.js 文件
- 在该文件中,创建一个 hisotry 对象并导出
- 在 App.js 中导入 history 对象,并设置为 Router 的 history
- 通过响应拦截器处理 token 失效
核心代码:
utils/history.js 中:
// 自定义history对象
import { createBrowserHistory } from 'history'
const history = createBrowserHistory()
export default history
App.js 中:
// 注意:此处,需要导入 Router 组件
import { Router } from 'react-router-dom'
import history from '@/utils/history'
function App() {
return (
<Router history={history}></Router>
)
}
utils/request.js 中:
// 添加响应拦截器
instance.interceptors.response.use(
function (response) {
// 对响应数据做点什么
return response
},
function (err) {
if (err.response.status === 401) {
// token过期了
// 提示消息
message.error('登录信息过期', 1)
// 清除token
store.dispatch(logout())
// 跳转到登录 history
history.push('/login')
}
// 对响应错误做点什么
return Promise.reject(err)
}
)