【问题标题】:redux dispatch not work when use in axios interceptors在 axios 拦截器中使用时,redux 调度不起作用
【发布时间】: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 组件的上下文中调用。

标签: javascript reactjs redux react-redux axios


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-02-08
    • 2020-05-13
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多