概要
ログイン状態をuseEffectで動的に確認し、コンテキストへログイン情報を保存するコードを書いています。
その中で二重に実行されてしまい困っています。
コード
React
1 const reducer = (state:any, action:any) =>{ 2 switch(action.type){ 3 case 'login': 4 return {...state, login:true, username:action.payload} 5 case 'logout': 6 return {...state, login:false, username:''} 7 } 8 } 9 const [state, dispatch] = useReducer(reducer,{login:false,username:''}) 10 11 React.useEffect(() => { 12 async function getCurrentAuthenticatedUser() { 13 const userInfo = await Auth.currentUserInfo(); 14 if(userInfo){ 15 dispatch({type: 'login', payload: userInfo.username}) 16 }else{ 17 dispatch({type: 'logout', payload: ''}) 18 } 19 } 20 getCurrentAuthenticatedUser(); 21 console.log(state) 22 }, [state.login]);
実行結果
コンソールログには下記ように表示されます。
{login: false, username: ""} {login: true, username: "hogehohehoge"}
質問
- 1回目の時点で「{login: true, username: "hogehohehoge"}」を表示される事を想定していましたが、実際は初期化した際のデータを表示されています。これは非同期に実行されていることが原因でしょうか?
- 1回目の時点で「{login: true, username: "hogehohehoge"}」と表示させるにはどの部分を変更すべきでしょうか?
補足
おそらく原因はuseEffectの第2引数にあると考えていますが、しかしuseEffect内で第2引数に変更を加える処理を書くと無限ループになってしまう事があります。
やはり、このようなケースはアンチパターンなのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。