我为一个函数设置了一个间隔计时器,该函数将今天的日期设置为我在 componenteDidMount
中初始化的状态。虽然我清除了 componentWillUnmount
中的间隔,但在组件之间快速切换后它仍然会给出错误(这就是我发现错误的方式)。
这是错误:
警告: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.
我曾尝试在整个循环中操作一个私有(private) _isMounted
变量从 false 到 true,并在设置状态之前强制对我的 setTodaysDate()
进行条件检查,但即使这样也没有解决问题。
// _isMounted = false; <----- tried this method to no avail
state = {
selectedDate: ""
};
componentDidMount() {
this.setTodaysDate();
this.interval = setInterval(() => this.setTodaysDate(), 40 * 1000 * 360);
// this._isMounted = true; <----- tried
}
componentWillUnmount() {
clearInterval(this.interval);
// this._isMounted = false; <----- tried
}
setTodaysDate = () => {
// if (this._isMounted) { <----- tried
this.setState({
selectedDate: moment(moment(), "YYYY-MM-DDTHH:mm:ss")
.add(1, "days")
.format("YYYY-MM-DD")
});
// } <----- tried
}
我不知道如何“堵住泄漏”。
编辑: 事实证明,多亏了下面的 Gabriele,真正的原因是我使用的 lodash 去抖动方法(我也在那里设置了状态),我在卸载过程中从未取消过该方法,导致“泄漏”:
debounceCloseAlert = _.debounce(() => {
this.setState({ alertVisible: false });
}, 5000);
最佳答案
查看您的组件,我认为问题不在于您的 setInterval
。您处理它的方式是正确的方法,不应产生所述错误。
我认为问题在于在您的 _.debounce
方法中使用了 debounceCloseAlert
。它还会创建超时,您不会在任何地方清除它。_.debounce
的返回值包含一个 .cancel()
方法来清除间隔。因此,只需在您的 this.debounceCloseAlert.cancel();
中调用 componentWillUnmount
即可清除它。
关于javascript - 由于 "state update",React 安装的组件 setInterval 未清除间隔,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54456662/