基本上我想在一个组件中有这个:
setTimeout(() =>
{
if (this.isMounted()) // NOTE: this does not exist
setState({ foo: 123 });
}, 5000);
但是没有API,我错了吗?
在未安装的组件上调用setState()
被视为错误(在开发模式下由React记录此错误)。
当然,我可以通过设置componentWillUnmount()
等来设置this._mounted = false
中的状态,但如果不需要,我也不想添加私有状态。
答案 0 :(得分:1)
虽然这是最初为isMounted()
创建的确切方案,但目前的建议为usage of isMounted()
is bad and will be removed in future React versions。
相反,您应该检查卸载组件时是否正确取消了任何异步函数。如果您使用setTimeout
,只需保存超时标识符并在componentWillUnmount
中取消即可:
this.timeout = setTimeout(() => {
this.setState({ foo: 123 });
}, 5000);
...
componentWillUnmount() {
clearTimeout(this.timeout)
}
所以要回答你的问题,没有,并且应该没有用于检查组件是否已安装的API。这是因为在卸载时,应清除对组件的所有引用,以便垃圾收集器可以将其从内存中删除。