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
相关产品推荐
相关产品推荐

