我正在尝试使用Firebase身份验证登录用户,并且遇到了以下问题:在操作创建者中使用onAuthStateChanged方法获取用户之前是否登录过。当用户之前登录时,我只是调用登录成功并将其导航到主屏幕,如果不是,我只是调度另一个操作并显示登录屏幕,但是如果调度了登录成功操作,我仍然会看到登录屏幕半秒钟,我将我是新来的响应native和redux的人,谁能帮我解决这个问题,非常感谢你们!!

这是我的index.js

import { checkLogin } from './actions';

class LoginScreen extends Component {
  componentDidMount() {
    this.props.checkLogin();
  }

  componentWillReceiveProps(nextProp) {
    if (nextProp.loggedIn) {
      this.props.navigation.navigate('main');
    }
  }

  //... some code

  render() {
    if (this.props.isChecking) {
      return <Spinner />
    }
    return this.renderContent();
  }
}

const mapStateToProps = ({ auth }) => {
  const { email, password, error, loading, loggedIn, isChecking } = auth;
  return { email, password, error, loading, loggedIn, isChecking };
};

export default connect(mapStateToProps, {
  emailChanged, passwordChanged, emailLogin, checkLogin
})(LoginScreen);


这是我的actions.js

import firebase from 'firebase';

export const checkLogin = () => {
  return(dispatch) => {
    firebase.auth().onAuthStateChanged(user => {
      if (user) {
        dispatch({ type: EMAIL_LOGIN_SUCCESS, payload: user });
      } else {
        dispatch({ type: CHECK_LOGIN_FAILED });
      }
    })
  }
}

// some code


和reducer.js

const INITIAL_STATE = {
  // ...
  isChecking: true,
}

export default (state = INITIAL_STATE, action) => {
  console.log(action);
  switch (action.type) {
    // ...
    case CHECK_LOGIN_FAILED:
      return { ...state, isChecking: false };
    case EMAIL_LOGIN_SUCCESS:
      return { ...state, user: action.payload, error: '', loading: false, email: '', password: '', loggedIn: true, isChecking: false };
    default:
      return state;
  }
}

最佳答案

我认为发生这种情况是因为化简器从组件的先前呈现中记住了isChecking的先前状态。我敢打赌,如果您重置模拟器的内容和设置,您将不会首先看到登录页面。但是,要解决此问题,我建议在firebase.auth()。onAuthStateChanged之前调度一个操作,以告诉您的减速器您处于“ isChecking”状态。

关于javascript - 在渲染 native redux之前渲染一个 Action ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47253192/

10-14 12:57