You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中Axios请求拦截器获取Auth Context状态值始终陈旧的问题求助

React中Axios请求拦截器获取Auth Context状态值始终陈旧的问题求助

各位大佬好,我最近碰到一个头疼的问题,想请大家帮忙看看!

我在React项目里设置了一个Axios请求拦截器,本来是想从Auth Context的状态里读取当前活跃的账户ID,把它自动附加到每个请求的参数里。但现在的问题是,拦截器函数里拿到的状态值总是陈旧的旧值,不管我怎么更新状态,拦截器里用的还是之前的那个值,我试了好几种方法都没解决,实在搞不懂为啥会这样,也不知道该怎么让拦截器获取到最新的状态值。

下面是我的代码片段:

const { accounts } = useAuth();

const accountInterceptorRef = useRef(null);

// ...其他代码

useEffect(() => {
  if (accountInterceptorRef.current) {
    api.interceptors.request.eject(accountInterceptorRef.current);
  }

  console.log('Active Account Is: ', accounts.active); // <--- 这里打印的永远是正确的最新值

  const interceptor = api.interceptors.request.use(
    async (config) => {
      console.log('Active Account (closure) Is: ', accounts.active); // <--- 这里打印的总是陈旧的旧值
      if (accounts.active) {
        config.params = config.params || {};
        config.params['user_account_id'] = accounts.active; // <--- 这里用的也是陈旧的旧值
      }
      return config;
    },
    (error) => Promise.reject(error)
  );

  accountInterceptorRef.current = interceptor;
}, [accounts.active]);

我再明确下现象:useEffect里监听accounts.active变化,每次状态更新都会重新创建拦截器,而且useEffect里直接打印accounts.active是完全正确的最新值,但一旦进到拦截器的回调函数里,accounts.active就变成了之前的旧值,导致请求参数带错了ID。

我的核心需求就是:让这个Axios拦截器每次都能获取到最新的accounts.active值,把它正确加到请求参数里。

备注:内容来源于stack exchange,提问作者Taylor Foster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 10:33:01