Gutentag,伙计们!
卸载组件后,我仍然从应用程序中收到此错误消息:
Warning: Can't call setState (or forceUpdate) 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.
in Header (at index.js:27)
现在这是Header组件中的代码:
class Header extends Component {
isCancelled = false;
state = {
someStateVars: x,
separateColumns: 'true',
}
handleChange = (event) => {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
if (!this.isCancelled) {
this.setState({ //######THIS IS LINE 27######
[name]: value
});
}
}
handleDisplayChange = (event) => {
const value = event.target.value;
const name = 'separateColumns';
if (!this.isCancelled) {
this.setState({
[name]: value
}, () => {
this.props.displayChange();
});
}
}
serversRefresh = () => {
if (!this.isCancelled) {
setTimeout(() => {
this.setState({refreshed: false});
}, localStorage.getItem('seconds')*1000); //disable refresh for 15 seconds
}
}
reactivateButton = () => {
if (!this.isCancelled) this.setState({refreshed: false});
}
componentDidMount() {
if(localStorage.getItem('seconds')>5 && !this.isCancelled){
this.setState({refreshed: true});
}
}
componentWillUnmount() {
this.isCancelled = true;
}
}
当我看到此错误时,我添加了isCancelled变量,该变量在componentWillUnmount()函数中更改为true。
在卸载Header组件之后,在15秒钟后,重新激活serversRefreshbutton时,出现此错误消息。
我该如何解决?
在遇到此问题的另一个组件上,“ isCancelled” var确实起到了帮助,但是在这里我看到它没有影响,并且问题仍然存在。
答案 0 :(得分:3)
只需将您的超时时间存储在变量中,例如
this.timeout = setTimeout(/* your actions here*/, /* your timeout */)
,然后在componentWillUnmount
componentWillUnmount() {
clearTimeout(this.timeout)
}
它应该可以解决您的问题,而不会像this.isCancelled
这样cru脚。检测组件的安装状态为空操作,因为即使卸载后它仍会从内存中卸载。
setTimeout
返回计时器的ID,以后可以使用该ID取消。 clearTimeout
通过其ID取消超时(如果尚未执行)。
有关您的案件的更多信息,您可以在这里阅读:Why isMounted is antipattern。
有关MDN上计时器的更多信息。