如何实现通知提示按队列依次显示而不是同时弹出?
我在用 React 做一个通知系统,希望每次只显示一个提示,等当前通知关闭后再显示下一个。但现在一连触发多个操作,所有通知会同时弹出来,体验很乱。
我试过用 useState 存一个队列,然后在 useEffect 里监听队列变化去显示第一个,但关掉通知后下一个不会自动弹出,感觉状态没更新对。下面是我现在的简化代码:
const [queue, setQueue] = useState([]);
const [currentNotice, setCurrentNotice] = useState(null);
useEffect(() => {
if (queue.length > 0 && !currentNotice) {
setCurrentNotice(queue[0]);
setQueue(prev => prev.slice(1));
}
}, [queue, currentNotice]);
const showNotice = (msg) => {
setQueue(prev => [...prev, msg]);
};
// 关闭时调用
const handleClose = () => {
setCurrentNotice(null);
};
问题是关掉第一个后,第二个不会自动显示,得再触发一次 showNotice 才行。是不是 useEffect 的依赖或者状态更新逻辑有问题?
正确的做法是:显示通知时不要从队列移除,等真正关闭时再移除。改一下代码:
这样关闭时会触发两次状态更新:先设 currentNotice 为 null,queue 少一个元素,然后 useEffect 检测到 queue 还有内容且 currentNotice 为空,自动显示下一个。性能上没有任何问题,React 的状态更新是异步的,会批量处理。