javascript - React Native Firestore 无限循环
问题描述
我正在尝试使用 documentSnapshot 从 firestore 获取用户数据,我可以获取数据,但它陷入了无限循环,更新了用户数据,
这是代码
import firestore from '@react-native-firebase/firestore';
export default function HomeScreen() {
const { user, logout } = useContext(AuthContext);
const [currentUser, setCurrentUser] = useState('');
useEffect(() => {
firestore()
.collection('users')
.doc(user.uid)
.get()
.then(documentSnapshot => {
if (documentSnapshot.exists) {
setCurrentUser(documentSnapshot.data())
}
})
})
return (
<View style={styles.container}>
<Title>{currentUser.displayName}</Title>
<FormButton
modeValue='contained'
title='Logout'
onPress={() => logout()} />
</View>
)
}
解决方案
每次您调用时,setCurrentUser
您都会强制重新渲染(因为这是一个状态变量)。你的useEffect
then 再次触发,它再次调用setCurrentUser
,依此类推,导致无限循环。
useEffect
为了防止这种情况,您应该设置一个在触发之前应该监听的变量列表。您可以通过将第二个参数传递给useEffect
.
useEffect(() => {
// your function call
}, [/* list of state/prop variables to respond to */])
如果您只想useEffect
触发一次,类似于componentDidMount
,您可以传递一个空数组。
从文档:
如果你想运行一个效果并且只清理一次(在挂载和卸载时),你可以传递一个空数组([])作为第二个参数。这告诉 React 你的效果不依赖于任何来自 props 或 state 的值,所以它永远不需要重新运行。这不是作为特殊情况处理的——它直接遵循依赖项数组的工作方式。
在您的情况下,您似乎可能希望放置user
在此数组中,因为这是您的 firestore 调用所依赖的唯一变量。如果user.uid
没有改变,则没有理由再次触发此效果。
推荐阅读
- c++ - 为什么你需要同时使用固定和显示点操纵器来显示小数点和尾随零,而只有固定才能完成这项工作?
- javascript - react-grid-gallery 的 onSelectImage Prop 功能不起作用
- react-native - 按钮的平面列表不会在第一次导航时呈现
- reactjs - 通过条件渲染新内容时删除以前的内容(React)
- c# - 在 X 为对数的图上插值(半对数图)
- sql - 在 Oracle sql 中转换日期格式
- javascript - 循环访问本地存储并附加
- django - 在序列化程序django中获取外键字段
- php - 使用 PHP 从 URL 中的表中获取数据
- database - 如何在 ERD 中表示两个实体集之间的多重关系?