使用带有反应 2 的谷歌登录按钮

Posted

技术标签:

【中文标题】使用带有反应 2 的谷歌登录按钮【英文标题】:Using google sign in button with react 2 【发布时间】:2015-10-16 21:06:41 【问题描述】:

这与Using google sign in button with react 本质上是相同的问题,但在我的情况下,接受的答案并不能解决它。

我有一个反应组件:

var LoginButton = React.createClass(

onSignIn: function(googleUser) 
  console.error(" user signed in");                                                                                                                                                               
,

componentDidMount: function() 
  console.log('component has mounted');
    gapi.signin2.render('g-signin2', 
      'scope': 'https://www.googleapis.com/auth/plus.login',
      'width': 200,
      'height': 200,
      'longtitle': true,
      'theme': 'dark',
      'onsuccess': this.onSignIn
    )
,

render: function() 
  return (
     <div className="g-signin2"/>
  );


但是,虽然登录成功,但永远不会调用 onSignIn 函数。事实上,我为呈现自定义登录按钮指定的选项都不存在(即方形和深色主题),所以我猜它呈现默认按钮是因为&lt;div&gt; 的类。

我目前正在同步加载库,否则当componentDidMount 被触发时,gapi 不在作用域内。

我看到的另一个选项是谷歌建议使用&lt;script src="https://apis.google.com/js/platform.js?onload=renderButton" async defer&gt;&lt;/script&gt; 并将我的渲染包装在一个函数中。但是,要么这个脚本必须加载到组件中,要么我必须找到一种方法,让这个函数在index.html 中作为回调传递,这似乎都不是一个好的解决方案。

如何让自定义登录按钮而不是默认按钮呈现?

【问题讨论】:

这个视频解释了谷歌、facebook 和链接登录与 reactjs youtu.be/9MhLHkf7Ifs。它可能会帮助某人:-) 【参考方案1】:

这个 hack 现在可以解决问题了...

在我的index.html 中,我在库加载时触发了一个自定义事件:

<script src="https://apis.google.com/js/platform.js?onload=triggerGoogleLoaded" async defer></script>
<script type="text/javascript">
  function triggerGoogleLoaded() 
    window.dispatchEvent(new Event('google-loaded'));
  
</script>

我的反应组件现在看起来像这样:

var LoginButton = React.createClass(

  onSignIn: function(googleUser) 
      console.log("user signed in"); // plus any other logic here
  ,

  renderGoogleLoginButton: function() 
    console.log('rendering google signin button')
    gapi.signin2.render('my-signin2', 
      'scope': 'https://www.googleapis.com/auth/plus.login',
      'width': 200,
      'height': 50,
      'longtitle': true,
      'theme': 'light',
      'onsuccess': this.onSignIn
    )
  ,

  componentDidMount: function() 
    window.addEventListener('google-loaded',this.renderGoogleLoginButton);
  ,

  render: function() 
    let displayText = "Sign in with Google";
    return (
       <div id="my-signin2"></div>
    );
  

);

请注意,呈现的&lt;div&gt; 具有“my-signin2”作为id 而不是class

【讨论】:

这在您需要直接进入由 React 呈现的页面时很有用。谢谢。 我完全按照您提到的方式进行了尝试,但出现'gapi' is not defined 错误。我的代码可以在github.com/hhimanshu/google-login-with-react 获得,你能帮我理解我在哪里犯了错误吗?【参考方案2】:

我使用JQuery,通过componentDidMount方法加载脚本...

componentDidMount: function() 
    $.getScript('https://apis.google.com/js/platform.js')
        .done(() => 
            // execute any gapi calls here...
            gapi.signin2.render('g-signin2', 
                // ... options here ...
            );
        );
,

正如 f13ts 所说,呈现的 &lt;div&gt; 应该有“my-signin2”作为 id,而不是类。

【讨论】:

以上是关于使用带有反应 2 的谷歌登录按钮的主要内容,如果未能解决你的问题,请参考以下文章

带有按钮 validate-angularjs 的谷歌验证码

小米10的谷歌框架打开了没反应

使用带有护照和续集的谷歌社交登录时多次执行查询

取消按钮在 iOS 的谷歌登录框架中不可见

带有 android 4.4 的谷歌键盘中的默认表情符号按钮

如何从ios中的谷歌帐户注销?