如何删除 Google OAuth2gapi 事件侦听器?

2024-01-09

我真的很难理解如何删除谷歌gapi事件监听器。下面粗体是所讨论的完整功能。

window.gapi.auth2.getAuthInstance().isSignedIn.listen(onAuthChange);

我想在 useEffect 挂钩中使用清理函数来删除事件侦听器,但执行此操作的实际代码...我认为与简单的 javascript“removeEventListener”不同?我在谷歌文档中找不到任何内容。我的问题是我需要知道其他页面上的身份验证状态何时发生变化,并且需要其他函数在事件触发时运行(身份验证状态更改) - 但由于原始版本不断运行,我最终得到了一堆不必要的函数调用。当您登录和退出时,情况会变得更糟......随着事件侦听器的累积。


import React, { useEffect, useContext, useState } from "react";
import history from "../history";
import { GeneralContext } from "../contexts/General";

const GoogleAuth = () => {
  const { state, setState } = useContext(GeneralContext);

  const onAuthChange = () => {
    const auth = window.gapi.auth2.getAuthInstance();
    setState({ authStatus: auth.isSignedIn.get() });

    if (auth.isSignedIn.get() === true) {
      const token = auth.currentUser.fe.qc.access_token;
      setState({ accessToken: token });
    }
  };

  // Check auth status on mount
  useEffect(() => {
    window.gapi.load("client:auth2", () => {
      window.gapi.client
        .init({
          clientId:
            "320808104510-qjdjiooodidc8jm1i000oteqc7h63029.apps.googleusercontent.com",
          scope: "https://www.googleapis.com/auth/books",
        })
        .then(() => {
          const auth = window.gapi.auth2.getAuthInstance();
          //setState({ authStatus: auth.isSignedIn.get() });
          console.log("Event listender mounted on Sign-in Page");
          auth.isSignedIn.listen(onAuthChange);
        });
    });
  }, []);

  const onClick = () => {
    console.log(state.authStatus);
    const auth = window.gapi.auth2.getAuthInstance();
    auth.signIn();
    //setState({ authStatus: auth.isSignedIn.get() });
  };

  // Proceed to next page if user Signs into Google
  const proceed = () => {
    //Verify sign in
    if (state.authStatus === true) {
      //console.log("I am signed in");
      history.push("/home");
    }
  };

  // Runs after state updates
  useEffect(() => {
    proceed();

    return () => {
      // console.log("GoogleAuth Unmounted");
      // const auth = window.gapi.auth2.getAuthInstance();
      // window.removeEventListener(onAuthChange(), auth.isSignedIn.listen()); <--This is my attempt to remove the event listender, but it didn't work! 
    };
  }, [state.authStatus]);

  return (
    <React.Fragment>
      <div to="/" className="login btn" onClick={onClick}>
        Sign in with Google
        <svg className="google__svg">
          <use xlinkHref="img/sprite.svg#icon-google"></use>
        </svg>
      </div>
    </React.Fragment>
  );
};

export default GoogleAuth;


我遇到了同样的问题,并且找不到任何文档来指导我正确的方向。虽然我找到的文档和打字稿都表明auth.isSignedIn.listen()没有返回值,检查浏览器控制台中的返回值发现情况并非如此。

它返回一个对象,该对象有一个remove()其原型上的方法。添加监听器时保存返回的对象,并调用它的remove清理中的方法。

  useEffect(
      () => {
        let listenerContext;

        window.gapi.load('client:auth2', () => {
          window.gapi.client.init({
            clientId,
            discoveryDocs: [...DISCOVERY_DOCS],
            scope: SCOPES,
          }).then(() => {
            const auth = window.gapi.auth2.getAuthInstance();
            listenerContext = auth.isSignedIn.listen(onSigninChange);
            // ... etc
          });
        });

        return () => {
          listenerContext?.remove();
        };
      },
      [],
  );

因为我找不到任何文档,所以我不能声称这是一个稳定的长期功能。至少,我希望它能帮助你在你的项目中畅通无阻。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何删除 Google OAuth2gapi 事件侦听器? 的相关文章

  • 如何在单页应用程序中使用 #-URL?

    本文 http danwebb net 2011 5 28 it is about the hashbangs提出了一个非常令人信服的论点 因为 URL 是长期存在的 它们被添加书签并传递 所以它们应该是有意义的 并且使用哈希进行真正的路由
  • mocha.opts 已弃用,如何迁移到 package.json?

    我正在开发一个大型项目 自从上周我更新了摩卡以来 现在我们收到警告 DeprecationWarning 通过 mocha opts 进行的配置已被弃用并且 将从 Mocha 的未来版本中删除 使用 RC 文件或 改为 package js
  • setTimeout 用于加载下拉列表中的项目

    我在用setTimeout克服 中提到的缓慢处理脚本警告 禁用 Internet Explorer 中的长时间运行脚本消息 https stackoverflow com questions 4460263 disabling the lo
  • Javascript - 使数组索引 toLowerCase() 不起作用

    我试图将所有数组索引设置为小写字符串 但它不起作用 我在这里查看了其他答案并尝试了他们的解决方案 例如使用toString 添加之前toLowerCase但它不起作用 这很奇怪 我创建了一个问题的jsfiddlehere https jsf
  • Express JS:请求的资源上不存在“Access-Control-Allow-Origin”标头

    我有一个在服务器上运行的 API 和一个连接到它以检索数据的前端客户端 我对跨域问题做了一些研究并使其发挥作用 但我不确定发生了什么变化 我现在在控制台中收到此错误 XMLHttpRequest 无法加载https api mydomain
  • 预加载 javascript 和 css 文件

    我目前正在开发一个移动网站 该网站大量使用图像 CSS 和 JavaScript 例如 它使用未压缩的 150KB 的库 我为图像构建了一个预加载器 效果相当好 function loadImages images var sum 0 fo
  • 处理时区转换的 JavaScript 库

    是否有一个 JavaScript 库可以处理时区转换 并考虑 DST 规则和此类内容 我知道有类似的问题 但我见过的问题似乎都没有真正适合我的问题的答案 我想在时区 A 创建一个日期并能够对其进行操作 添加天数 小时等 然后将其转换为另一个
  • Webpack - 资产大小限制中的警告:以下资产超出了建议的大小限制 (244 KiB)

    当我在生产模式下运行 webpack 时 有资产规模限制 超出 的警告 我怎样才能运行而不出现这个错误 在我的项目中 我包含 css 并且我看到 webpack 构建中包含一些 node module 目录 但是如果我排除 css 的 no
  • UpdatePanel 启动脚本未执行

    我正在编写一个在 SharePoint 网站中使用的 ASP NET Web 部件 并尝试使用 UpdatePanel 来呈现查询结果 我想使用 JQuery 插件来修改从异步回发返回的表 但我无法让启动脚本在异步更新上执行 我发现这个帖子
  • Google 地图 Javascript v3 折线点击事件

    我正在尝试显示一张地图 其中有多条路线布置为折线 单击多段线时 我想显示特定于该线的数据 将数据与线关联不是问题 但无论单击哪条线 显示的数据都会与最近绘制的线关联 就好像每条新折线都会覆盖最后一条线一样 我有一个数据库 其中包含 gpx
  • 反应独特的“关键”错误

    我正在浏览 React 中的待办事项列表教程 并遇到以下错误 我花了相当长的时间 只是找不到错误 这是错误和组件的代码 这就是代码对于课程存储库 此提交中出现问题 https github com andrewjmead react cou
  • Flask 和 Reactjs 抛出 JSX 转换错误

    我已经开始将 ReactJS 与 Python Flask 后端结合使用 通过 Flask 渲染模板时 我在 Chrome 控制台中收到以下客户端错误 错误 找不到模块 jstransform visitors es6 templates
  • 如何通过 React-router-4 删除所有浏览器历史记录

    我在用react router在水疗中心 就我而言 浏览器历史记录是 home gt somepage1 gt another gt changepassword 当我在路线上做某事时 changepassword 我想去 login路线
  • 带有桌子的嵌套表

    我在应用了表排序器的表中嵌套了表 它在嵌套表中添加了排序标题 但是它们没有对行进行排序 并且抛出了JavaScript错误 我想拥有 嵌套表不可排序 巢表上的排序实际上可以工作 但不是现状 您的第一个选择要容易得多 使嵌套表不可排序 像这样
  • FullCalendar:如何重新创建/重新初始化 FullCalendar 或批量添加多个事件

    我正在尝试将新事件批量添加到日历中 但未能找到方便的使用方法 所以我决定用新的事件数组重新初始化视图 所以我尝试了以下方法 var events title Event start new Date y m d 10 description
  • jQuery 模板插件:如何创建双向绑定?

    我开始使用 jQuery 模板插件 微软创建的 但现在我面临这个问题 模板用于绑定到对象数组的一堆表单 当我更改其中一个表单上的某些内容时 我希望更新绑定的对象 但我不知道如何自动执行该操作 这是一个简单的例子 现实生活中的模板和对象要复杂
  • Intern JS - 如何在链式 Command 方法中使用 Promise.all()?

    我是用 Intern JS 编写测试的新手 并且一直在遵循他们的文档来使用对象接口 https theintern github io intern interface object and 页面对象 https theintern git
  • 如何使用 API 中的数据填充选择的下拉元素 - ReactJS

    我对 React 还很陌生 我正在从 API 获取数据 当我检查控制台日志时可以看到数据 但是我不知道如何使用 map 创建一个新数组 然后选项元素可以使用该数组来显示货币代码 目前它填充下拉列表 但选项元素全部为空 结果显示为 NaN 下
  • 如何更改数据表中标题单元格的内容?

    我正在使用数据表 http datatables net plugin 在我的可排序列上 我想用按钮替换列文本 但是这样做 oSettings aoColumns i nTh text 我可以检索相应列的文本 但是 oSettings ao
  • 使用 javascript 从亚马逊 URL 中抓取 ASIN

    假设我有一个像这样的亚马逊产品 URL http www amazon com Kindle Wireless Reading Display Generation dp B0015T963C ref amb link 86123711 2

随机推荐

  • 无法在 Wear OS Samsung Galaxy Watch 4 上请求蓝牙权限

    我创建了一个示例 Wear OS 应用程序 它应该发现 BLE 设备 但我的代码需要蓝牙权限 当我将这些行放入清单中时
  • 角度 2 中的条件图像 Src 绑定

    三元条件如何写 img src在角度 2 中 下面是我尝试过的代码 但这不起作用 img class lib img height 500 width 500 alt default image src item pictureUrl nu
  • Nsdateformatter 以所选手机的语言返回日期。它可以一直只返回英文吗?

    我正在使用 dateformatter 来获取应用程序中的日期和时间 但是 当我更改手机日期格式器的语言时 我遇到了一个问题 它返回了手机所选语言的日期和时间 由于我们不支持多种语言 因此我的应用程序崩溃了 请找到下面的代码片段 NSDat
  • Android LocationManager 网络提供商返回 null

    我想使用 Android 应用程序获取我的 GPS 坐标 我开始开发 我可以获取GPS坐标 但它们不准确 我想使用 NETWORK PROVIDER 但该提供程序的位置始终为空 更有趣的是 isProvicerEnabled 返回 true
  • 通过 url 参数根据区域设置在 nginx 上设置自定义 404 错误页面

    我正在运行最新的稳定版本Nginx on GNU Linux操作系统并拥有以下虚拟主机 我正在尝试setup custom localized 404 error pages avoiding if但我总是陷入重定向循环 到目前为止 我只考
  • 对齐 html 电子邮件中表格中的数据单元格元素

    我有一个如下所示的屏幕截图 我必须在 HTML CSS 中复制它 附件是fiddle https jsfiddle net dehg79qs embedded result我现在可以复制它 我正在编写 HTML 电子邮件代码 因此这就是我在
  • 等待 asyncio.Future 会引发并发.futures._base.CancelledError,而不是等待设置值/异常

    当我运行以下 python 代码时 import asyncio import logging logging basicConfig level logging DEBUG async def read future fut print
  • 使用bundle exec运行rails控制台

    当我执行时bundle exec rails c我得到一个带有以下提示的 ruby 控制台 Loading development environment Rails 3 0 3 jruby 1 6 3 001 gt 一切看起来都按顺序进行
  • 将 console.log 转换为输出到 div

    我正在使用本主题中的简单 rss feed 解析器示例 Rss 解析器示例 https stackoverflow com questions 10943544 how to parse an rss feed using javascri
  • 应用程序关闭时发送通知

    当应用程序完全关闭时 如何以编程方式发送通知 示例 用户关闭了应用程序 也在 Android 任务管理器中 然后等待 应用程序应在 X 秒后或当应用程序检查更新时发送通知 我尝试使用这些代码示例 但是 应用程序关闭时推送通知 https s
  • sbt-assemble:跳过特定测试

    我想配置sbt assembly跳过特定的测试课程 有什么办法可以做到这一点吗 如果有帮助 我使用 ScalaTest 标记了测试 Network tag See 具有共享源的附加测试配置 http www scala sbt org 0
  • 0 在socket()系统调用中表示什么?

    下一行中的 0 表示什么 我还可以使用哪些其他标志 server socket AF UNIX SOCK STREAM 0 正如其他人可能所说的那样 第三个论点socket一般是一个int指示协议 0表示调用者不想指定协议并将其留给服务提供
  • 在 OSX 10.8 SDK/objective-c 中拖动按钮

    我开始使用 Objective Ctoday为了开发 OSX 山狮 的应用程序 我有一堆按钮 我想将它们拖到其他对象中 例如文本字段 我按照苹果开发网站上的教程进行操作 但我无法让拖动部分工作 放置部分工作 例如 我可以将文件从查找器拖到文
  • 低 RAM 消耗 C++ 特征求解器

    我是新手C 编程 但我有一个任务来计算特征值和特征向量 标准特征问题Ax lx 对于对称矩阵 和厄米矩阵 对于尺寸非常大的矩阵 二项式 L L 2 where L大约是18 22 现在我正在具有大约 7 7 GB 可用内存的机器上进行测试
  • 为什么我的重载 C++ 构造函数没有被调用?

    我有一堂这样的课 class Test public Test string value Test bool value 如果我创建一个像这样的对象 Test test Just a test bool 构造函数被调用 有人知道为什么吗 T
  • PHP使用session来选择下拉选项

    我已经获得了此上传表单 并且希望保留会话中下拉列表中的所选选项 以便在提交后显示最后的选择 例如我选择 颜色 选项 提交后颜色仍然在下拉列表中选择 我回显 SESSION testname 就在第一个单选按钮之前 它给我返回 颜色 但在选项
  • JQuery 中的简单 SQL 查询生成器

    我正在尝试找到一个类似于 SQL 查询生成器插件的简单查询生成器界面http plugins jquery com project SQL QUERY BUILDER http plugins jquery com project SQL
  • 是否可以乐观地更新端点的所有缓存?

    在 redux 教程中 我们学习了如何执行乐观更新 第 8 部分 rtk query advanced implementing optimistic updates https redux js org tutorials essenti
  • 将 4 字节消息头从 C# 客户端发送到 Java 服务器

    我正在尝试为用 Java 编写的服务器编写一个 C 客户端 服务器需要一个 4 字节 Java 中的 DataInputStread readInt 消息头 后跟实际消息 我对 C 完全陌生 如何将此消息头发送到 Java 服务器 我尝试了
  • 如何删除 Google OAuth2gapi 事件侦听器?

    我真的很难理解如何删除谷歌gapi事件监听器 下面粗体是所讨论的完整功能 window gapi auth2 getAuthInstance isSignedIn listen onAuthChange 我想在 useEffect 挂钩中使