reactjs - 为什么我的 React UseEffect(使用 Firebase onSnapshot)处于无限循环中,不断地安装和卸载?
问题描述
我有一个标题(我想像 facebook),并且有一个通知铃。我想收听 Firbase Firestore 上的新通知。
我已经设置了一个useEffect
,但由于某种原因存在无限循环,我不确定为什么?
这是useEffect
/ useState
:
const [subbedToNotifications, setSubbedToNotifications] = useState(false);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
useEffect(() => {
var unsubscribe = () => {
console.log("this function does nothing");
};
console.log("subscribing to notifications");
if (
userData !== null &&
auth.currentUser.uid !== null &&
!subbedToNotifications
) {
setSubbedToNotifications(true);
unsubscribe = db
.collection("users")
.doc(auth.currentUser.uid)
.onSnapshot((snapshot) => {
dispatch({
type: "SET_USERDATA",
userData: snapshot.data(),
});
});
}
// Detach listener
return () => {
console.log("unsubbing from notifications");
unsubscribe();
setSubbedToNotifications(false);
};
}, [subbedToNotifications]);
因此,当组件挂载和subbedToNotifications
更改时,它会运行此使用效果。围绕对 Firebase 的调用的 IF 要求userData
(我在其中存储用户名、个人资料图片、简历等内容),firebase 身份验证不能为空,也不能subbedToNotifications
为假。当调用 firebase 时,subbedToNotifications
设置为 true,因此不应该再次调用它,并且应该只订阅一次。
也从firebase返回取消订阅,但是控制台日志重复:
console.log("subscribing to notifications")
并且console.log("unsubbing from notifications")
不断地对数据库进行6k读取。
谁能发现我的错误,为什么useEffect
会进入循环,或者为什么 Header 不断安装和卸载?
蒂亚!
解决方案
尝试更改[subbedToNotifications]
为[]
推荐阅读
- android - 颤振视频播放器音轨变化
- sql - 如何在 SQL 3 中创建一个继承自另一个表的表?
- bash - 跳过名称中已包含 FINAL 的循环中的文件
- regex - 使用正则表达式和 golang 选择 jpg 图像
- java - 如何将 Mainactivity 移至 Fragment?
- laravel - Laravel 5.8 中的多对多关系错误
- java - 我应该如何在我的方法的参数中定义一个 lambda?
- ansible - ansible:主机特定剧本的最佳实践
- go - 使用 viper 定义 golang 程序配置时使用最大精度
- r - 如何通过检测可能的多个子字符串来匹配查找表,如将“US|USA|United States”与 R 中的 `abc,United States,xzy` 匹配?