javascript - 由于 firebase,我的 React 应用程序中的内存泄漏以及如何避免它?
问题描述
我正在开发的应用程序在登录时显示一个用户仪表板,并带有一个用于导航的侧边栏。它使用火力基地。我从我的firebase中获取大部分数据async componentDidMount()
并将数据存储在我的组件状态中。完成所有提取需要几秒钟。但是,如果用户决定在获取完成之前导航到另一个屏幕,我会得到
无法在未安装的组件上调用 setState
警告(如预期)。所以我做了一些挖掘并发现
if(this.isMounted()) this.setState({updates:updates})
使警告消失,但后来我也发现 usingisMounted
是一种反模式。
关于这个问题的官方文档建议我们自己跟踪挂载状态,方法是_isMounted=true
在. 我认为实现这一点的唯一方法是通过组件状态中的变量。事实证明,setState 在 componentWillUnmount 中不起作用。[问题1](我尝试调用一个外部函数,然后从该函数中设置状态变量。没有用。)componentDidMount
componentWillUnmount
componentWillUnmount
该文档提出了另一种方法,即使用可取消的承诺。但我对如何通过await firebase
电话实现这一目标一无所知。我也找不到任何方法来阻止 Firebase 呼叫中途。[问题2]
所以现在我被警告和数据泄露所困扰。
一个。我该如何解决这个问题?
湾。这是我需要认真对待的事情吗?
解决方案
如果存在卸载组件的风险,最好在请求完成时检查组件是否仍然挂载。
您不需要放入_isMounted
组件状态,因为它不会用于渲染。您可以将其直接放在组件实例上。
例子
class MyComponent extends React.Component {
state = { data: [] };
componentDidMount() {
this._isMounted = true;
fetch("/example")
.then(res => res.json())
.then(res => {
if (this._isMounted) {
this.setState({ data: res.data });
}
});
}
componentWillUnmount() {
this._isMounted = false;
}
render() {
// ...
}
}
推荐阅读
- python - 将 JSON 转换为 Pandas 数据框的更好方法
- javascript - Javascript通过相同的对象键重新排列数组
- postgresql - 物联网网络中的数据库交互
- bash - bash 尾错误:使用 -c 选项时无法打开输入
- c# - 投射 IEnumerable
列出 - google-cloud-dataproc - 一段时间后无法在 Google DataProc 上启动 DataLab
- powershell - 指定服务器时 Get-ADUser 后执行时间较长
- sql - ORA-02291 完整性约束
- android - 调用 viewmodel 方法时 UI 被阻塞
- java - 如何修复 log4j 中的“NoSuchMethodError”错误