firebase認証でユーザーをログインしようとしています。この問題は、アクションクリエーターでonAuthStateChangedメソッドを使用して取得する前にログインしているかどうかに関係していました。ユーザーがログインする前にログイン成功してメイン画面に移動すると、別のアクションを送信してログイン画面を表示するだけですが、ログイン成功のアクションがディスパッチされた場合でも半分ほどのログイン画面が表示されますネイティブとレキシックスに反応する新しい、誰も私がこの問題を解決するのを助けることができる、あなたにそんなに感謝!!ここリアクションネイティブレビュックスでレンダリングする前にアクションをディスパッチしますか?
は私の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;
}
}
最初の 'レンダリング 'を避けることはできません。私が考えることができる唯一の解決策は、必要なページ/コンポーネントを条件付きでレンダリングすることです。たとえば '{type:checking_auth}'などの別のアクションを送出し、それぞれローダまたはスピンナをレンダリングします。 –
ええ、私はそれを知っています、私は上記のように私のコードのようにしようとしていたが、まだ動作していない!悪い説明のために申し訳ありません – KanHa