因此,即使我在useEffect挂钩中使用clearInterval来禁用setTimeOut,尽管我需要完成超时,但仍收到以下错误消息:
警告:无法在已卸载的组件上执行React状态更新。 这是空操作,但它表明应用程序中发生内存泄漏。 要修复,请取消所有订阅和异步任务 componentWillUnmount方法。
我想另一个问题是,因为它是一个setTimeOut,持续时间不超过一秒钟,我真的需要对此进行关注吗?我的代码如下:
useEffect(() => {
return () => {
clearInterval(_isMounted);
};
},[urlReferer]);
return (
<User>
{({ data: { me }, error }) => {
if (error) return <Error error={error} />;
const userID = me && me.id;
const userType = (me && me.permissions.some(permission => ['GUEST_USER'].includes(permission))) ? 'GUEST_USER' : 'USER';
return (
...
<Form
method="post"
onSubmit={async e => {
e.preventDefault();
await signin();
setState({
...state,
name: '',
email: '',
password: '',
});
/* Now redirect user to previous page */
if (fromCart) {
Router.back();
_isMounted = setTimeout(() => { toggleCartOpen().catch(err => console.log(err.message)) }, 1000); // 1 second 1000
} else {
Router.push({
pathname: '/',
})
}
}}
>
```
答案 0 :(得分:2)
您可能应该使用clearTimeout
而不是clearInterval
。在setTimeout
中创建一个Timeout
对象,这就是您正在使用的对象。与使用setInterval
相对,然后您将使用clearInterval