【问题标题】:How do I use the Firebase onAuthStateChange with the new React Hooks?如何将 Firebase onAuthStateChange 与新的 React Hooks 一起使用?
【发布时间】:2019-08-17 09:04:00
【问题描述】:

我正在使用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;

但是我希望使用新的React Hooks 来消除对HOCs 的需求。我已经通过使用React ContextuseContext(FirebaseContext) 访问Firebase 的单个实例删除了withFirebase() HOC。有没有办法使用新的hooks 在我创建的components 中模仿withAuthentication HOC

我正在使用这个教程

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

标题为“高阶组件的会话处理”的部分包含此部分。

谢谢!

【问题讨论】:

  • 一种选择是使用react-firebase-hooks 库,它通过其useAuthState 钩子支持onAuthStateChange
  • 谢谢 Jeff,我确实研究过这个,但是我想减少我的项目所具有的依赖项的数量,因为它将来维护最少,所以我不想太担心重大变化!
  • @TristanTrainer - 你明白了吗?我正在努力解决同样的问题stackoverflow.com/questions/59977856/…

标签: reactjs firebase firebase-authentication react-hooks


【解决方案1】:

你可以写一个Custom Hook来注册一个效果并返回授权状态

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;

在任何Component 中,您都可以像这样使用它

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

Index.jsx 里面会有这段代码

ReactDOM.render( 
   <FirebaseProvider> 
      <App /> 
   </FirebaseProvider>, 
   document.getElementById('root')); 

这个 Firebase Provider 是这样定义的,

import Firebase from './firebase';

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

【讨论】:

  • @1nullpointer,useContext 是 react 开箱即用提供的一个钩子,您可以通过像 import {useContext} from 'react'; 一样导入来使用它
  • @1nullpointer 你将在你有FirebaseContext.Consumer 渲染HOC的组件中使用useContext。
  • 是的,你只需要 usecontext 并返回 FirebaaseContext.Consumer 的 render prop 在回调中返回的内容
  • 您可以创建一个自定义挂钩来调用这两个挂钩并返回结果,就像您为 useFirebaseAuthentication 所做的那样
  • 感谢您的回答 - 它澄清了一些事情。 FWIW,我结束了 useEffect,就像这样:useEffect(() =&gt; firebase.auth.onAuthStateChanged(onChange), [])
猜你喜欢
  • 2021-07-09
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 2019-10-23
  • 2022-11-29
  • 2020-08-02
相关资源
最近更新 更多