我正在开发一个 React 项目,使用 notistack 库来显示小吃栏。我有一个 ProfilePage 组件,在访问页面时根据特定数据显示两个小吃栏。但是,我还希望当用户离开页面时,小吃栏自动关闭。如果用户返回到个人资料页面,小吃栏应该会重新出现,不会出现任何问题。
目前,小吃店的行为出人意料:
当我离开个人资料页面时,小吃栏会关闭,但当我返回个人资料页面时,小吃栏会短暂重新出现并立即关闭,这不是所需的行为。
我怀疑问题在于 notistack 在页面之间导航时如何处理小吃栏以及 React 如何挂载/卸载组件。
我尝试了几种方法,包括:
这是我的代码的简化版本:
个人资料页面组件:
export default function ProfilePage() {
const { user } = useUserStore();
if (!user) return;
return (
<div>
<ProfilePageStatistics />
</div>
);
}
个人资料页面统计组件:
import { useEffect, useRef } from 'react';
import { useSnackbar } from 'notistack';
export default function ProfilePageStatistics() {
const { data } = userGetStatistics(); // Fetching data
const { enqueueSnackbar, closeSnackbar } = useSnackbar();
const isMounted = useRef(false);
const messages = {
expiring: 'Less than 15 days remaining',
expired: 'Expired',
};
useEffect(() => {
if (!isMounted.current) {
isMounted.current = true;
return;
}
if (data?.count15Days) {
enqueueSnackbar(messages['expiring'], {
variant: 'certificateStatus',
persist: true,
});
}
return () => closeSnackbar();
}, [data?.count15Days]);
useEffect(() => {
if (!isMounted.current) {
isMounted.current = true;
return;
}
if (data?.countExpired) {
enqueueSnackbar(messages['expired'], {
variant: 'certificateStatus',
persist: true,
});
}
return () => closeSnackbar();
}, [data?.countExpired]);
return <div>Profile Statistics Content</div>;
}
我想要实现什么
兄弟 useEffect 在某些 props 或状态更改不好时更新组件的状态 仅当从网络获取数据时使用 useEffect 阅读此文档 https://react.dev/learn/you-might-not-need-an-effect