2017-06-13 11 views
0

リデューサー初めての方へ。パスポート+クッキーを使用してユーザーを認証し、自分の状態がリフレッシュ

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
import { 
 
    LOGIN_USER_SUCCESS 
 
} from '../actions/types'; 
 

 
const INITIAL_STATE = { 
 
    error: '', 
 
    message: '', 
 
    content: '', 
 
    authenticated: false, 
 
    authenticating: false, 
 
    username: '', 
 
    fullName: '', 
 
    password: '', 
 
}; 
 

 
export default function(state = INITIAL_STATE, action) { 
 
    console.log('anything?'); 
 
    switch (action.type) { 
 
    case LOGIN_USER_SUCCESS: 
 
     console.log(';', action.fullName); 
 
     console.log(';;', action); 
 
     console.log(state.fullName) 
 
     return { 
 
     ...state, 
 
     fullName: action.fullName, 
 
     username: action.username, 
 
     password: action.password, 
 
     authenticating: false, 
 
     authenticated: true, 
 
     }; 
 
    return state; 
 
}
アクションの作成者

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
import { 
 
    LOGIN_USER_SUCCESS, 
 
} from './types'; 
 

 
import axios from 'axios'; 
 
import cookie from 'react-cookie'; 
 
import Cookies from 'universal-cookie'; 
 
const cookies = new Cookies(); 
 

 
const API_URL = 'http://localhost:3001/api'; 
 

 
export const loginUser = (username, password) => { 
 
    return function(dispatch) { 
 
    axios 
 
     .post(`${API_URL}/auth/login`, { username, password }) 
 
     .then(response => { 
 
     cookies.set('token', response.data.token, { path: '/' }); 
 
     cookies.set('user', response.data.user, { path: '/' }); 
 
     console.log(cookies.get('user')); 
 
     console.log(username); 
 
     dispatch({ 
 
      type: LOGIN_USER_SUCCESS, 
 
      fullName: response.data.user.fullName, 
 
     }); 
 
     setTimeout(
 
      function() { 
 
      //window.location.href = 'http://localhost:3000/auth/dashboard'; 
 
      }, 
 
      3000 
 
     ); 
 
     }); 
 
    
 
    }; 
 
};

私はどのように保つかに失わアプリを作成しますページからページへのリダイレクト時に状態が失われることはありませんか? window.location.hrefを実行すると、問題の原因と思われるページが更新されたようです。

答えて

0

答えはしていません。スクリプトの実行が停止し、ページが再読み込みされ、スクリプトが最初の新しい状態から再び開始されたため、反応のリフレッシュでは常に完全な状態が失われます。

多くの場合、ログインシナリオはajaxコールを発行して資格情報を取得することによって実装され、資格情報が到着すると状態に格納されます。

その後、コンポーネントでは資格情報が存在すると認識し、コンポーネントはログインではなくコンテンツを表示します。

こうしたシナリオは、しばしばreduxやreact routerのような反応パートナーライブラリを使用して実装されます。

+0

私の状態ではisAuthenticatedブール値を変更しなければなりませんし、そうでなければ私のコンポーネントで真のリダイレクトを渡します。そうでなければ、自分のアクションクリエータではなくログインにリダイレクトしますか? localStorageの代わりにクッキーを使用することは必須ですか? – fj785

+0

ログインからauthenitcatedコンテンツへの切り替えに関しては、あります。クッキー、ローカルストレージに関して、私はそれがReactに関連しているとは思わない。言い換えれば、あなたが何をしていても、それはあなたがセキュリティに取り組みたい、そして/または作業しているサイトが必要とするものです。 –

0

window.location.hrefの代わりにreact-routerを使用してアプリケーションをナビゲートします。 DavorinRuševljanが言ったように、リフレッシュについては、リフレッシュすると状態は常にReactで失われます。たとえば、localStorageを使用して状態を保存し、ComponentWillMountにロードしてから、その状態で再び動作させることができます。

+0

ありがとうございます。 "react-router"をwindow.location.hrefの代わりにリダイレクトする方法のサンプルコードを提供できますか? – fj785

+1

反応ルータv4の場合は、次のノードを表示するだけです。

関連する問題