我有一个react原生应用程序,我从firebase firestore数据库中获取用户,它工作正常,但是当我尝试从用户对象中获取关注者长度时,它没有显示或改变,只有当我修改代码和应用程序刷新时才会改变。
我在某处读到useEffect在第二帧上运行,所以我尝试将代码放在useEffect之外,但没有任何变化
const [followingLength, setFollowingLength] = useState(0);
const [followersLength, setFollowersLength] = useState(0);
useEffect(() => {
const userSub = onSnapshot(doc(firestore, "Users", userId), (doc) => {
setUser(doc.data())
if (user.following.length !== 0) {
setFollowingLength(user.following.length)
}
if (user.followers.length !== 0) {
setFollowersLength(user.followers.length)
}
});
});
<Text style={{ color: colors.white }}>{followingLength}</Text>
<Text style={{ color: colors.white }}>{followersLength}</Text>
1条答案
按热度按时间sqserrrh1#
从我所看到的事情来看:
问题1:为什么你的
useEffect
没有dependency array
?在这种情况下,代码将在每个渲染中执行,这将是错误和昂贵的。问题2:您是否知道
setUser
不会立即更新user
对象,并且您的if
中的user
是“旧的”并且捕获了闭包?问题3:你知道
onSnapshot
返回unsubscribe
函数,需要调用这个函数来停止监听器吗?在你的例子中,你在每个渲染中添加了一个额外的监听器,这也是有缺陷的,而且代价很高。我不能100%肯定这些问题的组合是你的问题的确切来源,但他们肯定应该得到解决
注意:您可以使用
useMemo
来计算关注和关注者。