众所周知,除了 React 组件或自定义钩子,不能在其他地方使用 React 钩子。
本文将介绍基于 TypeScript 在 Axios 拦截器中使用钩子函数的方法。
步骤
- 准备一个 React 工程,并安装 axios。
- 在
src/utils
目录下创建一个 request.tsx
文件,用于封装 axios 请求。文件路径、名称可以自行修改。
- 将下面的内容添加到
request.tsx
文件中。
- 在合适的位置添加
AxiosInterceptor
组件,包裹应用。
request.tsx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import axios from "axios"; import { useEffect, useState, ReactNode } from "react"; import { useNavigate } from "react-router-dom";
interface AxiosInterceptorProps { children: ReactNode; }
axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8"; const service = axios.create({ timeout: 10000, });
const AxiosInterceptor = ({ children }: AxiosInterceptorProps) => { const navigate = useNavigate(); const [isSet, setIsSet] = useState(false); useEffect(() => { const resInterceptor = (response: any) => { return response.data; };
const errInterceptor = (error: any) => { return Promise.reject(error); };
const interceptor = service.interceptors.response.use( resInterceptor, errInterceptor );
setIsSet(true); return () => service.interceptors.response.eject(interceptor); }, [navigate]);
return isSet && children; };
export default service; export { AxiosInterceptor };
|
App.tsx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import { AxiosInterceptor } from "./utils/request"; import ThemeProvider from "./theme-context"; import AuthProvider from "./auth-context";
const App: React.FC = () => { return ( <ThemeProvider> <AuthProvider> <AxiosInterceptor> <div>YOUR_APP_CONTENT</div> </AxiosInterceptor> </AuthProvider> </ThemeProvider> ); };
export default App;
|
References