将 Facebook Web SDK 与 ReactJS 组件状态集成

IT技术 javascript facebook reactjs webpack
2021-05-14 03:51:57

我开始使用 ReactJS、NodeJS、Webpack 和 Facebook SDK 进行用户身份验证。所有这些技术及其相关的软件工程原则/最佳实践对我来说都相对较新(甚至 JavaScript 对我来说也很新)。

我已经按照https://developers.facebook.com/docs/facebook-login/web 上的教程进行了操作,并且 Facebook 身份验证运行良好!但是本教程内容的结构方式,在我看来,SDK 的设计只希望将 FB 状态响应处理程序包含在原始页面 HTML 中的<body>标记内。以下特别提到了这一点:

  // Load the SDK asynchronously
  (function(d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
  }(document, 'script', 'facebook-jssdk'));

这个策略让我觉得不完美并且很难与 React 组件集成。例如,有没有办法将 Facebook 登录/身份验证代码和 Facebook 状态更新处理程序从 HTML 重新定位到通过 Webpack 与 React 代码捆绑在一起的脚本中?是否可以?我的问题的部分原因是,如果我理解正确,为了让我的 Facebook 状态更新处理程序能够更新我的 React 组件的状态,该处理程序需要成为组件的一部分才能访问相关的 React 组件this.setState(...)功能。

我什至正确地思考这个问题吗?

3个回答

是的,您是对的,可以很好地将 facebook 登录与 react 组件集成在一起。

示例登录组件可以是这样的 -

import React from 'react';

class LoginComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {

    };
  }

  loadFbLoginApi() {

        window.fbAsyncInit = function() {
            FB.init({
                appId      : FB_APP_ID,
                cookie     : true,  // enable cookies to allow the server to access
                // the session
                xfbml      : true,  // parse social plugins on this page
                version    : 'v2.5' // use version 2.1
            });
        };

        console.log("Loading fb api");
          // Load the SDK asynchronously
        (function(d, s, id) {
            var js, fjs = d.getElementsByTagName(s)[0];
            if (d.getElementById(id)) return;
            js = d.createElement(s); js.id = id;
            js.src = "//connect.facebook.net/en_US/sdk.js";
            fjs.parentNode.insertBefore(js, fjs);
        }(document, 'script', 'facebook-jssdk'));
  }

  componentDidMount() {
        this.loadFbLoginApi();
    }

    testAPI() {
      console.log('Welcome!  Fetching your information.... ');
      FB.api('/me', function(response) {
      console.log('Successful login for: ' + response.name);
      document.getElementById('status').innerHTML =
        'Thanks for logging in, ' + response.name + '!';
      });
    }

    statusChangeCallback(response) {
      console.log('statusChangeCallback');
      console.log(response);
      if (response.status === 'connected') {
        this.testAPI();
      } else if (response.status === 'not_authorized') {
          console.log("Please log into this app.");
      } else {
          console.log("Please log into this facebook.");
      }
    }

    checkLoginState() {
      FB.getLoginStatus(function(response) {
        this.statusChangeCallback(response);
      }.bind(this));
    }

    handleFBLogin() {
        FB.login(this.checkLoginState());
        }

    render() {
        return (
                <div>
                    <MyButton
                        classNames = "btn-facebook"
                        id         = "btn-social-login"
                        whenClicked = {this.handleFBLogin}
                        >
                            <span className="fa fa-facebook"></span> Sign in with Facebook
                    </MyButton>
                </div>
               );
    }
}

export default LoginComponent;

当收到的响应状态已连接时,这意味着用户通过 Facebook 登录,您可以在组件上设置状态以反映这一点。例如

response.status === 'connected'
this.setState({userLoggedIn:true});

MyButton在 React 中使用了一个自定义按钮组件 ( ),您可以很容易地创建它。

使用 npm react-facebook 怎么样?它包括一些组件,如“初始化”(这是为了在函数子项中公开 FB Api)或处理 facebook 弹出屏幕以进行登录的 LoginButton,或者如果您想制作自己的按钮,您可以使用组件登录。只需将 facebook 应用程序 ID 提供给项目根目录下的 FacebookProvider 组件(仅调用一次),并使用提供诸如 react-facebook 之类的出色节点module的组件。

https://www.npmjs.com/package/react-facebook

我找到了另一种在 webpack 中加载 fb-sdk 文件的方法,使用 npm 包: react-load-script

按照这个简单的包来实现相同的:https : //www.npmjs.com/package/react-load-script