在哪里放置 firebase.auth().onAuthStateChanged()

Posted

技术标签:

【中文标题】在哪里放置 firebase.auth().onAuthStateChanged()【英文标题】:Where to place firebase.auth().onAuthStateChanged() 【发布时间】:2018-01-02 22:04:05 【问题描述】:

我正在使用 react 和 redux 实现基本的 firebase 身份验证。 我根据this link 上的 react-router 示例创建了受保护的路由,到目前为止一切正常。

现在,我从在用户身份验证中设置的 auth reducer 获取用户的登录状态,但我想在使用 onAuthStateChanged() 刷新页面后保持登录状态。

我应该在哪里放置 onAuthStateChanged() 函数?有什么最佳做法可以使用它吗?

我的代码供参考如下:

App.js

<PrivateRoute path="/dashboard" component=Dashboard />
<Route path="/login" component=Login />

ProtectedRoute.js

const PrivateRoute = ( component: Component, ...rest ) => 
const  loggedIn  = rest;
return (
    <Route ...rest render=props => (
      loggedIn ? (<Component ...props />) : (
        <Redirect to=
          pathname: '/login',
          state:  from: props.location 
         />
      )
    ) />
  )


function mapStateToProps(auth)
  return 
    loggedIn: auth.loggedIn
  

export default connect(mapStateToProps)(PrivateRoute);

actions_auth.js

export const loginUser = ( email, password , callback ) => 
console.log(email, password)
return(dispatch) => 
  dispatch( type: LOGIN_USER );
  auth.signInWithEmailAndPassword(email, password)
    .then(
      user =>  
        dispatch(
        type: LOGIN_USER_SUCCESS,
      payload: user
    );
    callback();
  ,
  error =>  
      console.log( error.message );        
      dispatch( 
        type: LOGIN_USER_FAIL,
        error: error.message 
      );
    
  )
 

reducer_auth.js

const INITIAL_STATE = 
  email: '',
  password: '',
  error: '',
  loading: false,
  loggedIn: false
;

export default (state = INITIAL_STATE, action) => 
  switch (action.type) 
    case EMAIL_CHANGED:
      return  ...state, email: action.payload ;
    case PASSWORD_CHANGED:
      return  ...state, password: action.payload ;
    case LOGIN_USER:
      return  ...state, loading: true, error: '' ;
    case LOGIN_USER_SUCCESS:          
      return  ...state, ...INITIAL_STATE, user: action.payload, loggedIn: true ;
    case LOGIN_USER_FAIL:
      return  ...state, error: action.error ;
    case LOGOUT_USER:
      return  ...state, ...INITIAL_STATE ;
    default:
      return state;
  
;

【问题讨论】:

【参考方案1】:

你应该把它放在你创建 redux store 的地方,应该是你渲染 App 组件的地方。 您可以查看here 了解更多详情。 如果你经常使用 firebase,我建议你花一些时间来设置这个很棒的库react-redux-firebase

【讨论】:

谢谢@ykorach,我通过将函数放在 App.js 中解决了我的问题,但我一定会看看那个库。

以上是关于在哪里放置 firebase.auth().onAuthStateChanged()的主要内容,如果未能解决你的问题,请参考以下文章

firebase.auth().currentUser 为空

如何在 Firebase/Auth 上避免 UIWebView

Firebase Auth - 更新用户的电子邮件后,Firebase Auth 会注销用户

使用自己的身份验证服务器的firebase-auth模块和firebase-common-auth的重复

致命错误:找不到模块“firebase_auth”@import firebase_auth

如何在firebase.auth(js,ts)中更新用户电话号码