首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么我的反应状态没有正确地改变?

为什么我的反应状态没有正确地改变?
EN

Stack Overflow用户
提问于 2020-05-06 19:22:33
回答 2查看 91关注 0票数 2

我正在尝试在react中使用firebase进行身份验证。这是跟踪我的身份验证状态的组件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    import { useState} from "react";


    function useAuth(fbAuth) {
       const [isAuthenticated, setIsAuthenticated] = useState(false);
       const createEmailUser = (email, password) => fbAuth.createUserWithEmailAndPassword(email, password);
       const signInEmailUser  = (email, password) => fbAuth.signInWithEmailAndPassword(email, password);
       const signOut = fbAuth.signOut();

       fbAuth.onAuthStateChanged(async user=> {
          if (user) {
             await setIsAuthenticated(true);
             console.log(isAuthenticated, "should be true")
             return
          } else {
             await setIsAuthenticated(false);
             console.log(isAuthenticated, "should be false")
             return
          }

        });

       return {isAuthenticated, createEmailUser, signInEmailUser, signOut};

    }

    export default useAuth

单击登录时,控制台日志为

2useAuth.js:13 false“应为真”

2useAuth.js:17 false“应该为false”

2useAuth.js:17 true“应为false”

4useAuth.js:17 false“应该为false”

EN

回答 2

Stack Overflow用户

发布于 2020-05-06 19:37:45

setIsAuthenticated函数不返回promise,所以在这里使用await实际上不会做任何事情。最重要的是,isAuthenticated的值永远不会被修改(调用setIsAuthenticated不会改变您在钩子开始处已经设置的变量的值)。基本上,在onAuthStateChanged函数中执行console.log是没有意义的,也不会做您期望的事情。如果您想更好地了解正在发生的事情,请尝试在函数的开头放置一个console.log,并只打印您希望它发生更改的事实。所以就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { useState, useEffect } from "react";

function useAuth(fbAuth) {
   const [isAuthenticated, setIsAuthenticated] = useState(false);
   const createEmailUser = (email, password) => fbAuth.createUserWithEmailAndPassword(email, password);
   const signInEmailUser  = (email, password) => fbAuth.signInWithEmailAndPassword(email, password);
   const signOut = fbAuth.signOut();

   console.log('isAuthenticated', isAuthenticated)
   //I'm assuming you only need to register the fbAuth.onAuthStateChanged
   //callback once. So We use useEffect with an empty array to have it
   //only run the first time this is rendered.
   useEffect(() => {
       fbAuth.onAuthStateChanged(async user=> {
          if (user) {
             setIsAuthenticated(true);
             console.log('isAuthenticated should be true after this')
          } else {
             setIsAuthenticated(false);
             console.log('isAuthenticated should be false after this')
          }
        });
    }, [])

    return {isAuthenticated, createEmailUser, signInEmailUser, signOut};

}

export default useAuth

然后你就会期望

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Initial render
isAuthenticated false

//Click log-in
isAuthenticated should be true after this
isAuthenticated true

//Click log-out
isAuthenticated should be false after this
isAuthenticated false
票数 0
EN

Stack Overflow用户

发布于 2020-05-06 19:39:06

我看不出这里有什么问题。您可以在值更改之前获取该值。要访问最新的状态,可以使用useEffect钩子。你也没有问任何问题,比如你的问题是什么,你期望什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61643629

复制
相关文章
状态变换 | 我的代码没有else
「状态模式」比较简单,就是算法的选取取决于自己的内部状态。相较「策略模式」算法的选取由用户决策变成为内部状态决策,「策略模式」是用户(客户端)选择具体的算法,「状态模式」只是通过内部不同的状态选择具体的算法。
用户1093396
2020/10/28
8730
状态变换 | 我的代码没有else
为什么 Java 线程没有 Running 状态?
Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:
Java技术栈
2019/10/14
1.2K0
为什么 Java 线程没有 Running 状态?
面试官问:为什么 Java 线程没有 Running 状态?我懵了
Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:
芋道源码
2019/08/30
1.6K1
面试官问:为什么 Java 线程没有 Running 状态?我懵了
面试官问:为什么 Java 线程没有 Running 状态?我懵了
Java 虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:
沉默王二
2019/09/26
4160
面试官问:为什么 Java 线程没有 Running 状态?我懵了
面试官问:为什么 Java 线程没有 Running 状态?我懵了
有人常觉得 Java 线程状态中还少了个 running 状态,这其实是把两个不同层面的状态混淆了。对 Java 线程状态而言,不存在所谓的running 状态,它的 runnable 状态包含了 running 状态。
Java团长
2019/09/17
4380
面试官问:为什么 Java 线程没有 Running 状态?我懵了
为什么我的HibernateDaoSupport没有注入SessionFactory
1.按理来说Spring应该会通过setSessionFactory方法将SessionFactory注入进来,可是并没有。
用户2032165
2019/04/09
3.1K0
为什么我的HibernateDaoSupport没有注入SessionFactory
websphere解压/部署war包时长时间没有反应或卡死状态
故障现象: xx综合业务管理系统POC环境,在Was8.5.5.13 + JDK1.8 环境下 was无法部署war程序包, 现象如下图所示:上传war包之后就会一直卡在第一步页面,长时间没有反应,查看系统进程,java进程CPU一直在100%之上;
范一刀
2021/08/10
1.3K0
面试官:为什么Java线程没有Running状态?
Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:
田维常
2019/10/31
3600
为什么 MyBatis 源码中,没有我那种 if···else
在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。
搜云库技术团队
2023/10/21
1930
为什么 MyBatis 源码中,没有我那种 if···else
为什么 MyBatis 源码中,没有我那种 if···else
在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。
一行Java
2023/09/19
2200
为什么 MyBatis 源码中,没有我那种 if···else
Koa封装改变公共状态的方法
在后端开发中,应交互要求,经常会用到一些改变状态的方法,如收藏与取消收藏、点赞与取消点赞、上架与下架等等,今天给大家分享一个用Koa结合MongoDB封装的改变状态的方法,实现如下:
越陌度阡
2020/11/26
5510
为什么没有运营的SaaS没有未来?
来源:大虫运营心经  作者 : 花大虫 ---- 职业生涯前几年一直在做C端互联网相关的工作,这两年突然转做B端了,感受有很大的差异,但是却又有很大的相似性,To C的运营经验对To B的运营有巨大的帮助。越做越觉得To B行业有意思,大有可为。 最近我会把近2年亲身经历的一些To B行业运营经验分享给大家。 万信是我现在创业在做的一家餐饮SaaS公司,后面文章中会有涉及。 ✎✎✎ 大家谈To B都会讲产品、讲销售,很少人会讲到运营。殊不知一个To B产品的运营非常关键,因为这直接决定了一个非常重要
腾讯SaaS加速器
2020/06/09
9520
Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
毫无疑问 Python 中没有所谓的 main 入口函数,但是网上经常看到一些文章提“Python 的 main 函数”、“建议写 main 函数”……
Python猫
2020/06/04
2.5K0
Java线程为何没有Running状态?我猜你不知道。
Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:
Bug开发工程师
2019/08/13
3820
Java线程为何没有Running状态?我猜你不知道。
当CUDA程序执行后没有反应.....
有一天,QQ群里有人求助,说CUDA程序执行后没有反应!! 不过这个问题太常见了,经常被问及到 面对这个情况,让我们来说说 CUDA调试正确的打开方式! 1 请依次逐API返回值进行检查,看看他们是否
GPUS Lady
2018/03/30
2.6K0
当CUDA程序执行后没有反应.....
CPS推广:为什么我的佣金还没有到账呢
CPS推广奖励的佣金,目前无法直接后台提现,需要在次月月结之后,由财务系统统一打款到银行,即推广者后台所填写的银行账号,一般上月佣金,次月月末到账,具体时间以银行到账为准。
腾讯云-推广奖励
2019/11/28
10.7K0
CPS推广:为什么我的佣金还没有到账呢
为什么我用了Redis之后,系统的性能却没有提升
很多时候,我们在面对一些热点数据的时候,通常会选择将热点数据放到redis中,以减少数据库的查询,减轻数据库的压力。但是如果我们使用redis的方式不对,那么可能导致系统的性能不升反降。
Java进阶之路
2022/08/03
1.9K0
为什么我用了Redis之后,系统的性能却没有提升
#PY小贴士# 抓下来的网页为什么没有我要的内容?
现在绝大多数网站的内容并非直接通过你访问的 URL 请求直接返回,而是会通过一种叫做 AJAX 的方法,在页面的基本框架加载完毕后,再通过其他的请求向后台服务器再次请求获取的。这被称作“异步加载”,好处是将动态数据和静态的显示框架相分离,既提高了加载速度、提升用户体验,又方便多平台的接口复用。具体细节我不展开了,你可以网上去按我给到的关键字去搜索相关内容,下次我也会专门发下这方面的讲解文章。
Crossin先生
2019/12/19
2.1K0
#PY小贴士# 抓下来的网页为什么没有我要的内容?
点击加载更多

相似问题

反应状态没有被改变

11

我是否没有正确地更新我的反应状态?

11

useState没有改变状态的反应

23

我没有正确地改变我的redux商店的状态

23

为什么我的反应状态变得不可改变?

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文