如何将Firebase onAuthStateChange与新的React Hooks一起使用?

Tri*_*ner 8 firebase reactjs firebase-authentication react-hooks

我正在使用Firebase我的应用程序对用户进行身份验证。我已经创建了SignInSignUp表单,并且可以成功创建新用户并使用存储的用户登录。但是,问题出在维护用户之后,保持用户登录状态Reload

我在教程中看到的方式是使用HOC类似以下内容的命令检查当前用户是否已登录。

const withAuthentication = Component => {
  class WithAuthentication extends React.Component {
    constructor(props) {
      super(props);

      this.state = {
        authUser: null,
      };
    }

    componentDidMount() {
      this.listener = this.props.firebase.auth.onAuthStateChanged(
        authUser => {
          authUser
            ? this.setState({ authUser })
            : this.setState({ authUser: null });
        },
      );
    }

    componentWillUnmount() {
      this.listener();
    }

    render() {
    return (
      <AuthUserContext.Provider value={this.state.authUser}>
        <Component {...this.props} />
      </AuthUserContext.Provider>
      );
    }
  }

  return withFirebase(WithAuthentication);
};

export default withAuthentication;
Run Code Online (Sandbox Code Playgroud)

但是,我希望使用新版React Hooks本来消除对的需要HOCs。我已经withFirebase() HOC通过使用React ContextuseContext(FirebaseContext)访问的单个实例删除了Firebase。有没有使用新的方式hooks来模拟这个withAuthentication HOC范围内components,我创造?

我正在使用本教程

https://www.robinwieruch.de/complete-firebase-authentication-react-tutorial/

标题为“使用高阶组件进行会话处理”的部分包含这一部分。

谢谢!

Shu*_*tri 7

您可以编写一个Custom Hook注册效果并返回auth状态的

const useFirebaseAuthentication = (firebase) => {
    const [authUser, setAuthUser] = useState(null);

    useEffect(() =>{
       const unlisten = firebase.auth.onAuthStateChanged(
          authUser => {
            authUser
              ? setAuthUser(authUser)
              : setAuthUser(null);
          },
       );
       return () => {
           unlisten();
       }
    });

    return authUser
}

export default useFirebaseAuthentication;
Run Code Online (Sandbox Code Playgroud)

在任何情况下Component都可以像

const MyComponent = (props) => {
   const firebase = useContext(FirebaseContext);
   const authUser = useFirebaseAuthentication(firebase);

   return (...)
}
Run Code Online (Sandbox Code Playgroud)

Index.jsx 将包含此代码

ReactDOM.render( 
   <FirebaseProvider> 
      <App /> 
   </FirebaseProvider>, 
   document.getElementById('root')); 
Run Code Online (Sandbox Code Playgroud)

该Firebase Provider的定义如下:

import Firebase from './firebase';

const FirebaseContext = createContext(); 
export const FirebaseProvider = (props) => ( 
   <FirebaseContext.Provider value={new Firebase()}> 
      {props.children} 
   </FirebaseContext.Provider> 
); 
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答 - 它澄清了一些事情。FWIW,我最终对 useEffect 进行了一行操作,如下所示: `useEffect(() =&gt; firebase.auth.onAuthStateChanged(onChange), [])` (3认同)