javascript - 获取Firebase数据库()时如何正确清理函数()?
问题描述
我收到以下错误。我认为这是因为即使我的组件卸载,我仍然订阅了 Firebase 数据库。我正在尝试利用实时功能,以便每当从列表中删除项目时,它都会反映在 UI 上。
我创建了多个函数来获取不同的文档。下面是一个例子。
export const getAllTask = (userId) => {
return new Promise((resolve, reject) => {
const db = database.ref('tasks');
db.child(`${userId}/taskItems`).on('value', (snapshot) => {
const user = snapshot.val();
if (user) {
resolve(user);
} else {
reject(user);
}
});
});
};
然后,每当我的任何组件时,它都会运行我的 useEffect 来获取数据,但是当它卸载时,我如何才能正确使用off()
或正确清理?有没有更好的方法来做到这一点?
useEffect(() => {
const test = async (userId) => {
await getAllTask(userId).then((result) => {
setItems(result);
});
};
test(userId);
}, [userId]);
解决方案
试试这个,useEffect 返回一个在组件卸载时调用的函数
useEffect(() => {
let mounted=true;
const test = async (userId) => {
await getAllTask(userId).then((result) => {
if(mounted) setItems(result)
});
};
test(userId);
return ()=>{mounted=false}
}, [userId]);
推荐阅读
- reactjs - 如何使用多个滚动条防止 Chrome 滞后?
- http - Go 上下文处理程序是否有任何方法可以检测底层连接(客户端)已经消失而没有完全读取请求正文
- opencv - 自训练 HAAR 分类器导致令人失望的低准确率
- http - 将文件中的 GET 参数解析为 Go 中的 NewRequest 调用
- python - 我们有什么方法可以在 sklearn 中使用重心进行局部线性嵌入吗
- mysql - 每小时创建一个具有唯一名称的新列
- three.js - 如何在三反应纤维中从画布中获取所有 Object3D
- node.js - 为什么MongoClient返回404
- performance - 卡夫卡消费者滞后与fluntd
- r - Adding text on each bar in horizontal bar plot in ggplot