发布于 2026-01-06 1 阅读
0

Axios拦截器中的React hooks

Axios拦截器中的React hooks

如您所知,React hooks 只能在 React 组件或自定义 hooks 中使用。

本文将介绍如何在 Axios 拦截器中使用 hooks。

首先,创建一个 React 项目。

yarn create react-app hooks-in-axios-interceptors

// or

npx create-react-app hooks-in-axios-interceptors
Enter fullscreen mode Exit fullscreen mode

然后创建一个具有自定义配置的 Axios 实例。

import axios from 'axios';

const instance = axios.create({
    baseURL: "https://example.com"
})

export default instance;
Enter fullscreen mode Exit fullscreen mode

由于我们需要 React 组件来使用 hooks,让我们在这里编写一个组件。

import axios from 'axios';

let instance = axios.create({
    baseURL: "https://example.com"
}) 

function AxiosInterceptor({children}) {
    return children;
}

export default instance;
export {AxiosInterceptor}
Enter fullscreen mode Exit fullscreen mode

在组件中添加拦截器会产生副作用,所以我们需要借助useEffecthook 来实现。

将拦截器添加到 Axios 实例中useEffect

注意:您必须在useEffectreturn 语句中删除拦截器,因为每次执行useEffect都会向 Axios 实例添加一个新的拦截器。

import axios from 'axios';
import { useEffect } from 'react'

const instance = axios.create({
    baseURL:  "https://example.com"
})

const AxiosInterceptor = ({ children }) => {

    useEffect(() => {

        const resInterceptor = response => {
            return response;
        }

        const errInterceptor = error => {
            return Promise.reject(error);
        }


        const interceptor = instance.interceptors.response.use(resInterceptor, errInterceptor);

        return () => instance.interceptors.response.eject(interceptor);

    }, [])
    return children;
}


export default instance;
export { AxiosInterceptor }
Enter fullscreen mode Exit fullscreen mode

现在,您可以导入所需的钩子并在拦截器处理程序中使用它们。
例如,如果您想将返回状态码为 401 的请求重定向到登录页面,您可以使用useNavigate钩子(来自 react-router-dom)或钩子useRouter(来自 next/router)。

import axios from 'axios';
import { useEffect } from 'react'
import { useNavigate } from 'react-router-dom'

const instance = axios.create({
    baseURL:  "https://example.com"
})

const AxiosInterceptor = ({ children }) => {

    const navigate = useNavigate();

    useEffect(() => {

        const resInterceptor = response => {
            return response;
        }

        const errInterceptor = error => {

            if (error.response.status === 401) {
                navigate('/login');
            }

            return Promise.reject(error);
        }


        const interceptor = instance.interceptors.response.use(resInterceptor, errInterceptor);

        return () => instance.interceptors.response.eject(interceptor);

    }, [navigate])

    return children;
}


export default instance;
export { AxiosInterceptor }
Enter fullscreen mode Exit fullscreen mode

注意:由于我们不想破坏应用程序的 SPA 行为,因此我们不使用window.location重定向。

最后,我们使用 Axios 拦截器组件包裹该应用程序。

import { AxiosInterceptor } from './axios'
import ThemeProvider from './theme-context'
import AuthProvider from './auth-context'

function App() {
  return (
    <ThemeProvider>
      <AuthProvider>
        <AxiosInterceptor>
          <div>
            App
          </div>
        </AxiosInterceptor >
      </AuthProvider>
    </ThemeProvider>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

注意:如果要访问其他上下文数据,Axios 拦截器组件必须是上下文提供程序的子组件。

Codesandbox 示例

结论

这样,你就可以在 Axios 拦截器中轻松使用 React hooks 了。

文章来源:https://dev.to/arianhamdi/react-hooks-in-axios-interceptors-3e1h