0

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; 
    } 
} 
+0

最初の 'レンダリング 'を避けることはできません。私が考えることができる唯一の解決策は、必要なページ/コンポーネントを条件付きでレンダリングすることです。たとえば '{type:checking_auth}'などの別のアクションを送出し、それぞれローダまたはスピンナをレンダリングします。 –

+0

ええ、私はそれを知っています、私は上記のように私のコードのようにしようとしていたが、まだ動作していない!悪い説明のために申し訳ありません – KanHa

答えて

0

である私は、これは以前の状態ので、たまたまだと思いますisCheckingはあなたのコンポーネントの以前のレンダリングから減速機によって記憶されます。あなたが最初にログインページを表示しないように、シミュレータのコンテンツと設定をリセットすると、私は賭けます。しかし、これを修正するには、firebase.auth()。onAuthStateChangedの前にアクションをディスパッチして、あなたが "isChecking"状態にあることを減速機に伝えることをお勧めします。

+0

答えていただきありがとうございます!はい、私はあなたが言ったように、最初にウェルカムページをロードしてからログインしました。そして、私はonAuthStateChangedの前にアクションをディスパッチしようとしましたが、今はisChecking状態ですが、まだ動作しませんでしたので、最初にloginpageをロードしようとしました。どうもありがとうございます。 – KanHa

関連する問題