##解決したいこと
Reactでログイン機能を実装しようとしています。
流れとしては、ログイン情報(メールアドレスとパスワード)を入力してログインするとログインしているとき用のヘッダーに切り替えるといった流れです。
Login
1import React from "react"; 2import { withRouter } from "react-router"; 3import { createStore } from "redux"; 4import { Provider } from "react-redux"; 5 6import ValidatedLoginForm from "./ValidatedLoginForm"; 7 8//ステートの値 9let state_value = { 10 email: 'ooooo@aaa.com', 11 password: 'aaaaa0712', 12 isLoggedIn: false 13} 14 15//レデューサー 16function changeHeader(state = state_value, action){ 17 switch(action.type){ 18 case 'LOGIN': 19 return{ 20 isLoggedIn:true 21 }; 22 case 'NOTLOGIN': 23 return{ 24 isLoggedIn: false 25 }; 26 default: 27 return state; 28 } 29} 30 31class Login extends React.Component { 32 render() { 33 34 return ( 35 <div className='login-page'> 36 <Provider store={store}> 37 <ValidatedLoginForm /> //ログイン可能かどうかのチェックをするコンポーネント 38 </Provider> 39 </div> 40 ); 41 } 42} 43export let store = createStore(changeHeader); 44 45export default withRouter(Login);
ValidationLoginForm.jsでログイン可能かどうかの判定をし、それに応じてdispatchをしています。
Header
1import React from "react"; 2import { withRouter } from "react-router"; 3 4import { store } from "./Login"; 5 6class Header extends React.Component { 7 8 render() { 9 return ( 10 <div className="header"> 11 {(() => { 12 if ( store.getState().isLoggedIn ) { 13 return ( 14 <div className="header-contents"> 15 ログインユーザー用ヘッダー 16 </div>) 17 } else { 18 return ( 19 <div className="header-contents"> 20 未ログインユーザー用ヘッダー 21 </div> 22 ) 23 } 24 })()} 25 </div> 26 ); 27 } 28} 29 30export default withRouter(Header);
ログイン可能なメアドとパスワードを打ち込んでも「未ログインユーザー用のヘッダー」のままでした。
(ちなみに決め打ちでtrue、falseを設定したら切り替えられるのは確認済みです)
それぞれisLoggedIn
の値がどうなっているかコンソールで確認したところ、ログイン用のメアドやパスワードを打ち込む前は各ファイルでのはfalse
になっており、ログイン可能なメアドとパスワードを打ち込んだらHeader
でだけfalse
になって他のファイルではtrue
になっているのを確認しました。
考えたこと
- おそらくdispatchでstateが変更される前の値が参照されてる
- stateが変更されたあとに再レンダリングしないといけない?
などかなと考えましたが解決策を見つけれませんでした。
なにか方法がわかる方は教えていただきたいです。
修正・追記(10/3)
ログイン可能なメアドとパスワードを入力し、その後もう一回別のページに遷移するとヘッダーの変更ができていることが確認できました。そうなってからHeader.js
でのisLoggefIn
の値はtrue
になっていたのでおそらくリアルタイムで反映できていないのだろうと考えました。ここのレンダリングをログインしたのと同時に行いたいのですがその方法がわかりません。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/06 07:14
2019/10/06 07:25