我有以下代码
const fetchCurrentUser = async () => {
let u = await firebase.auth().currentUser;
setUser(u)
console.log(user)
let prof = await firebase.firestore().collection('abc').doc(u.uid).get();
prof === null ? prof = await firebase.firestore().collection('efg').doc(u.uid).get() : null;
setUserProfile(prof);
console.log(u)
console.log(prof)
console.log(user)
console.log(userProfile)
}
useEffect(() => {
fetchCurrentUser();
}, [])
代码的输出是
someObject()
someObject()
null
null
当u和prof不为空且恰好高于我设置user =u和profile = prof时,用户和配置文件怎么可能为空?
发生的情况是,我第一次得到非空用户,然后用户变成空(没有任何操作),不确定这是怎么可能的。因为我正在获取的用户来自firebase,所以它不应该在没有任何操作的情况下更改
发布于 2021-05-31 00:37:12
在React中,设置状态是异步的,所以如果您在下一行立即记录它,您将无法看到更新后的状态。
在这种情况下,您需要做的是在依赖项数组中结合使用useEffect
和user
,以便在user
发生更改时执行操作。
const fetchCurrentUser = async () => {
let u = await firebase.auth().currentUser;
setUser(u)
}
useEffect(() => {
fetchCurrentUser();
}, [])
useEffect(() => {
(async () => {
if(user) { //to ensure that we only take actions if user is actually set
console.log(user)
let prof = await firebase.firestore().collection('abc').doc(u.uid).get();
prof === null ? prof = await firebase.firestore().collection('efg').doc(u.uid).get() : null;
setUserProfile(prof);
console.log(u)
console.log(prof)
console.log(user)
console.log(userProfile)
})()
}, [user]) //only trigger function when user state changes (and for first render)
https://stackoverflow.com/questions/67763448
复制相似问题