Ciao,你的问题是你在MyAttempt 组件中用来管理snackPack 的双重useEffect。当您从App.jsx 呼叫onShowSnackbar 时,您正在更改snackData 以显示新的零食内容。但是此时,这个 useEffect 会被触发:
React.useEffect(() => {
setSnackPack((prev) => [...prev, { snackData, key: new Date().getTime() }]);
}, [snackData]);
这个改变了零食内容,你会看到一秒钟的新零食内容。然后这个其他 useEffect 将被触发:
React.useEffect(() => {
if (snackPack.length && !messageInfo) {
// Set a new snack when we don't have an active one
setMessageInfo({ ...snackPack[0] });
setSnackPack((prev) => prev.slice(1));
setOpen(true);
} else if (snackPack.length && messageInfo && open) {
// Close an active snack when a new one is added
setOpen(false);
}
}, [snackPack, messageInfo, open]);
这个关闭了旧的小吃并重新打开了新的。这就是闪烁的原因。
为避免这种情况,有必要在设置新的snackPack 之前将messageInfo 设置为undefined。所以把第一个useEffect改成这样:
React.useEffect(() => {
setMessageInfo(undefined); // set messageInfo to undefined
setSnackPack((prev) => [...prev, { snackData, key: new Date().getTime() }]);
}, [snackData]);
闪烁消失。
Here 你的密码箱已修改。