如何在useMutation中实现先显示Snackbar再执行页面跳转?
解决Snackbar显示后再跳转页面的问题
问题核心是:setOpen 更新状态是异步的,且立即调用 navigate 会直接卸载当前组件,导致Snackbar还没渲染就被销毁,无法正常显示。以下是两种可靠的解决方法:
方法一:利用Snackbar的onClose回调(推荐)
借助Material UI Snackbar的onClose事件,在Snackbar关闭(包括自动关闭或用户手动关闭)时再执行页面跳转,确保用户能看到提示:
- 修改
useMutation的onSuccess,只负责打开Snackbar:
useMutation({ mutationFn: fnname, onSuccess: () => { setOpen(true); }, });
- 在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
相关产品推荐
相关产品推荐

