import axios from "axios";
import { useNavigate } from "react-router-dom";
export const api = axios.create({
baseURL: "http://127.0.0.1:8000/",
headers: {
"content-type": "application/json",
},
});
api.interceptors.response.use(
function (response) {
return response;
},
function (er) {
if (axios.isAxiosError(er)) {
if (er.response) {
if (er.response.status == 401) {
// Won't work
useNavigate()("/login");
}
}
}
return Promise.reject(er);
}
);
6条答案
按热度按时间jpfvwuh41#
在RRDv6之前的世界里,你会创建一个自定义的
history
对象,导出、导入并传递给Router
,导入并在外部javascript逻辑中访问,比如redux-thunks、axios实用程序等。要在RRDv6中复制这一点,您还需要 * 创建一个自定义路由器组件,以便可以向其传递外部
history
对象。这是因为所有更高级别的RRDv6路由器都维护自己的内部历史上下文,因此我们需要复制历史示例化和状态部分,并传递props以适应基本Router
组件的新API。创建所需的历史对象:
导入并传递到新的
CustomRouter
:在axios函数中导入和使用:
更新
react-router-dom
导出历史路由,即unstable_HistoryRouter
。示例:
注:
此API当前的前缀为
unstable_
,因为您可能会无意中向应用添加两个版本的history
库,一个是添加到package.json的版本,另一个是React Router内部使用的版本。建议不要将history
添加为直接依赖项,而是依赖react-router
包中的嵌套依赖项。匹配的版本,则此API将删除其unstable_
前缀。uttx8gqw2#
我也遇到了同样的问题,这就是我所做的,它对我很有效(based on an answer from a similar question for react router v4
我在react路由器配置中添加了一个拦截器组件,它传递useNavigate钩子的属性
从axios配置文件中删除拦截器,并将它们放在单独的拦截器文件中
SetupInterceptor.js
axiosconfigfile.js
将AxiosInterceptor组件添加到app.js
app.js
bybem2ql3#
从v6.1.0开始,您可以轻松地在react组件之外进行重定向。
只需将
BrowserRouter
替换为HistoryRouter
即可。酱料酱:https://github.com/remix-run/react-router/issues/8264#issuecomment-991271554
omtl5h9j4#
我已经通过创建拦截器组件解决了这个问题:
并将其连接到App组件:
lnvxswe25#
自版本6.1.0起,React Router有一个
unstable_HistoryRouter
。有了它,history
现在可以再次在React上下文之外使用。它的用法如下:来源
当被问到
unstable_
-前缀是什么意思时,其中一个维护人员回答说:unstable_ prefix只是表示您可能会遇到错误,因为历史版本与React路由器本身请求的历史版本不匹配。虽然实际影响可能只是创建类型问题(不同历史版本之间的不同类型),但也可能有API或行为更改导致更微妙的错误(如如何解析URL,或如何生成路径)。
只要你时刻关注react-router请求的历史版本,并确保它与你的应用使用的版本同步,你就不会遇到问题。我们还没有针对不匹配的保护或警告,因此我们暂时称之为不稳定。
hmmo2u0o6#
这不起作用的原因是因为您只能使用React组件或定制钩子内的钩子。
由于两者都不是,因此
useNavigate()
钩子失败。我的建议是将整个逻辑封装在一个定制钩子中。
伪码:
在这里,只需将axios调用作为回调传递给钩子。
对于react router从v5迁移到v6的参考,这个video是有帮助的