Firebase,react和redux等待商店更新

时间:2017-12-07 21:25:02

标签: reactjs firebase authentication redux redux-thunk

我有一个连接到Firebase的React应用,我想检查用户是否在每次刷新页面时登录,调度IS_SIGNED_IN操作,这是动作创建者:

export function checkAuth() {
return dispatch => {
    firebaseAuth().onAuthStateChanged((user) => {
        if (user) {
            dispatch(signedInAction())
        } else {
            dispatch(signedOutAction())
        }
    })
  }
}

在reducer中我只是将布尔isAuthenticated设为true / false:

case ActionTypes.isSignedIn: {
    return Object.assign({}, state, {
        isAuthenticated: true
    })
}
case ActionTypes.isSignedOut: {
    return Object.assign({}, state, {
        isAuthenticated: false
    })
}

因为我想在应用程序加载时检查用户是否已登录我在componentDidMount发送操作(我猜错了):

class Main extends Component {

constructor(props) {
    super(props);
}

componentDidMount() {
    store.dispatch(checkAuth());
}

render() {
    return (
        <Provider store={store}>
            <Router>
                <Theme>
                    <Routes />
                </Theme>
            </Router>
        </Provider>
    );
  }
}

这使得我检查isAuthenticated的代码失败,因为它尚未在商店中设置,例如在Routes组件中。解决这个问题的最佳方法是什么?要加起来,我知道我可以使用条件渲染并检查何时定义isAuthenticated,但我不喜欢这个解决方案。思考?感谢

1 个答案:

答案 0 :(得分:1)

我已经完成了您尝试使用实时应用程序并在Firebase Auth中使用的内容。您需要使用Actions作为登录和注销,然后使用componentWillMount()和componentWillReceiveProps()来检查用户是否已登录:

操作:

import { auth } from '../fire';
export const GET_USER = 'get_user';

export function getUser(){
    return dispatch => {
        auth.onAuthStateChanged(user=>{
            dispatch({
                type: GET_USER,
                payload: user
            });
        });
    };
}

export function login(email,password){
    return dispatch => auth.signInWithEmailAndPassword(email, password);
}

export function logout(){
    return dispatch => auth.signOut();
}

export function createAccount(email, password){
    return dispatch => auth.createUserWithEmailAndPassword(email, password);
}

你的减速机应该有这个:

import {GET_USER} from '../Actions/UserActions';

export default function( state = {loading:true}, action){
    switch (action.type){
        case GET_USER:
            return { loading: false, ...action.payload };
        default:
        return state;
    }
}
例如,在你的App.js中,只是在它的开头使用它:

 componentWillMount(){
   this.props.getUser();
   if(this.props.user.loading === false && this.props.user.email === undefined){
     this.props.history.replace('/Login');
   }
 }

 componentWillReceiveProps(nextProps){
  if(nextProps.user.loading === false && nextProps.user.email === undefined){
    this.props.history.replace('/Login');
  }
 }

这是因为您已经在道具中拥有Auth凭证。

我希望这对你有用..