在 axios 拦截器中使用时,redux 调度不起作用

Posted

技术标签:

【中文标题】在 axios 拦截器中使用时,redux 调度不起作用【英文标题】:redux dispatch not work when use in axios interceptors 【发布时间】:2020-06-23 21:37:27 【问题描述】:

我想在 axios 返回错误时显示快餐栏。 我使用 redux 来配置快餐栏。

axiosAgent.interceptors.response.use(
  function(response) 
    return response;
  ,
  function(error) 
    console.log('object')
    const dispatch = useDispatch();
    dispatch(
      type: ActionsTypes.CHANGE_SNACKBAR_CONFIG,
      payload:  variant: "error", message: Strings.errors.problem 
    );
    dispatch( type: ActionsTypes.CHANGE_SNACKBAR_SHOW, payload: true );
    return Promise.reject(error);
  
);

这是我的快餐栏组件:

export default function Snackbar() 
  const open = useSelector(state => state.Snackbar.showSnackbar);
  const config = useSelector(state => state.Snackbar.snackbarConfig);
  const dispatch = useDispatch();

  const handleClose = (event, reason) => 
    if (reason === "clickaway") 
      return;
    
    dispatch( type: ActionsTypes.CHANGE_SNACKBAR_SHOW, payload: false );
  ;
  useEffect(() => 
    console.log(config);
  , [config]);
  return (
    <SB open=open autoHideDuration=6000 onClose=handleClose>
      <Alert onClose=handleClose severity=config.variant>
        config.message
      </Alert>
    </SB>
  );

但不起作用。 当我从组件调度它时它可以工作,但在这里不起作用。

【问题讨论】:

useDispatch 必须在 React 组件的上下文中调用。 【参考方案1】:

钩子,例如useDispatch(),只能在函数组件的主体中使用。你不能在拦截器中使用useDispatch。如果你需要在拦截器中调度一个动作,你需要引用store对象,并调用store.dispatch(/* action */)

【讨论】:

以上是关于在 axios 拦截器中使用时,redux 调度不起作用的主要内容,如果未能解决你的问题,请参考以下文章

需要在 axios 中存储时需要循环

React + axios + redux 拦截器

在 React Redux 中调度操作之前等待多个 Axios 调用

使用 Redux-Thunk / Axios 从 onUploadProgress 事件调度操作

如何使用 react redux 正确调度 axios 删除

将错误响应拦截器放在 redux-axios-middleware 上