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

如何在useMutation中实现先显示Snackbar再执行页面跳转?

解决Snackbar显示后再跳转页面的问题

问题核心是:setOpen 更新状态是异步的,且立即调用 navigate 会直接卸载当前组件,导致Snackbar还没渲染就被销毁,无法正常显示。以下是两种可靠的解决方法:

方法一:利用Snackbar的onClose回调(推荐)

借助Material UI Snackbar的onClose事件,在Snackbar关闭(包括自动关闭或用户手动关闭)时再执行页面跳转,确保用户能看到提示:

  1. 修改useMutation的onSuccess,只负责打开Snackbar:
useMutation({
  mutationFn: fnname,
  onSuccess: () => {
    setOpen(true);
  },
});
  1. 在Snackbar组件中添加onClose回调,完成关闭后跳转:
<Snackbar
  open={open}
  autoHideDuration={3000} // 设置自动关闭时长,比如3秒
  onClose={(event, reason) => {
    setOpen(false);
    // 可选:排除用户点击空白处关闭的情况
    if (reason !== 'clickaway') {
      navigate('/somepath');
    }
  }}
  message="注册成功!"
  // 其他自定义属性(比如关闭按钮)
/>

方法二:使用setTimeout延迟跳转

如果不需要依赖Snackbar的关闭事件,可以通过定时器延迟执行跳转,给Snackbar足够的渲染和显示时间:

useMutation({
  mutationFn: fnname,
  onSuccess: () => {
    setOpen(true);
    // 延迟3秒跳转,时长对应Snackbar的自动关闭时间
    setTimeout(() => {
      navigate('/somepath');
    }, 3000);
  },
});

内容的提问来源于stack exchange,提问作者Manish Baraskar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:55:54