首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >react本机集函数不更新变量

react本机集函数不更新变量
EN

Stack Overflow用户
提问于 2021-05-31 00:30:22
回答 2查看 46关注 0票数 0

我有以下代码

代码语言:javascript
运行
复制
    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();
    }, [])

代码的输出是

代码语言:javascript
运行
复制
someObject()
someObject()
null
null

当u和prof不为空且恰好高于我设置user =u和profile = prof时,用户和配置文件怎么可能为空?

发生的情况是,我第一次得到非空用户,然后用户变成空(没有任何操作),不确定这是怎么可能的。因为我正在获取的用户来自firebase,所以它不应该在没有任何操作的情况下更改

EN

Stack Overflow用户

发布于 2021-05-31 00:37:12

在React中,设置状态是异步的,所以如果您在下一行立即记录它,您将无法看到更新后的状态。

在这种情况下,您需要做的是在依赖项数组中结合使用useEffectuser,以便在user发生更改时执行操作。

代码语言:javascript
运行
复制
    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)
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67763448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档