Как мне реализовать аутентификацию Firebase с локальным состоянием с перехватами? - PullRequest
0 голосов
/ 26 февраля 2020

Я следовал , используя-firebaseauth-with-local-state для реализации аутентификации в моем приложении реагирования, но я использую функциональные компоненты и ловушки. Как я должен реализовать componentDidMount() и componentWillUnmount()?

Вот код, который я имею в компоненте Login.jsx:

import React, { useState, useEffect } from 'react'

import StyledFirebaseAuth from "react-firebaseui/StyledFirebaseAuth";
import firebase from "firebase";


// Configure Firebase.
const config = {
  apiKey: "myapikey",
  authDomain: "mydomain.firebaseapp.com"
  // ...
};
firebase.initializeApp(config);

// Configure FirebaseUI.
const uiConfig = {
  // Popup signin flow rather than redirect flow.
  signInFlow: "popup",
  // Redirect to /signedIn after sign in is successful. Alternatively you can provide a callbacks.signInSuccess function.
  signInSuccessUrl: "/",
  // We will display Google and Facebook as auth providers.
  signInOptions: [
    firebase.auth.GoogleAuthProvider.PROVIDER_ID,
    firebase.auth.FacebookAuthProvider.PROVIDER_ID
  ],
  callbacks: {
    // Avoid redirects after sign-in.
    signInSuccessWithAuthResult: () => false
  }
};

export default function Login() {
  const [signedIn, setSignIn]= useState(false);

  useEffect(() => {
    return () => {
    const unregisterAuthObserver = firebase.auth().onAuthStateChanged(
        (user) => setSignIn({isSignedIn: !!user})
    );
    unregisterAuthObserver();
    console.log("Sdd")
    };
  })

  if (!signedIn) {
    return (
      <div>
        <h1>My App</h1>
        <p>Please sign-in:</p>
        <StyledFirebaseAuth
          uiConfig={uiConfig}
          firebaseAuth={firebase.auth()}
        />
      </div>
    );
  }

  return (
    <div>
      <h1>My App</h1>
      <p>Welcome {firebase.auth().currentUser.displayName}! You are now signed-in!</p>
      <a onClick={() => firebase.auth().signOut()}>Sign-out</a>
    </div>
  );
}

1 Ответ

1 голос
/ 26 февраля 2020

Как мне реализовать componentDidMount() и componentWillUnmount()?

Использовать useEffect с пустым массивом для эмуляции componentDidMount; затем верните функцию из того же useEffect для эмуляции componentWillUnmount.

В вашем коде useEffect вернет функцию, что означает, что эта функция будет выполняться, когда компонент будет размонтирован, поэтому firebase.auth().onAuthStateChanged будет подключен, когда вы закончите с компонентом Login.

Чтобы сделать правильный крючок, установите useEffect следующим образом:

useEffect(() => {

  const unregisterAuthObserver = firebase.auth()
    .onAuthStateChanged(
      (user) => setSignIn({isSignedIn: !!user})
    );

  // Now you either return just unregisterAuthObserver
  // which will be called when the component is unmounted
  return unregisterAuthObserver;

  // or you create a function if you want more login when the component is unmounted
  // return () => {
  //   unregisterAuthObserver();
  //   console.log("Sdd");
  // }

}, []); // Important, pass an empty array so to execute useEffect hook only once
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...