action.js
:
export const login = creds => {
console.log(`${url}/login`);
const requestOptions = {
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json"
},
body: creds
};
return function(dispatch) {
dispatch({ type: LOGIN_REQUEST });
function timer() {
return fetch(`${url}/login`, requestOptions).then(response => {
if (!response.ok) {
console.log(response);
return response.json().then(json => {
var error = new Error(json.message);
error.response = response;
throw error;
});
} else {
console.log("3");
return response.json();
}
}).then(user => {
if (user.message === "ok") {
localStorage.setItem("token", user.token);
dispatch({ type: LOGIN_SUCCESS, payload: user.token });
window.location.href = `${app}/dashboard`;
} else {
const error = user.message;
throw new Error(error);
}
}).catch(function(error) {
dispatch(loginError(error));
});
}
setTimeout(timer, 5000)
}
};
ダッシュボードに単一ページの方法でリダイレクトすることはできません。よく検索しましたが、何も役に立ちませんでした。 React Router v4。を使用しています。JWTでこのユーザーログインを正しい方法で実行しているかどうかを提案してください。
この history library を使用して、history.js
ファイルに独自のhistory
を作成します。
//history.js
import createHistory from 'history/createBrowserHistory'
const history = createHistory()
export default history
ルーターに提供します。
<Router history = {history}>.....</Router>
次に、このhistory
オブジェクトを使用して、どこからでもリダイレクトできます。あなたの行動では:
import history from './history'
history.Push(`${app}/dashboard`)
react-router-redux
_を追加すると、すべてのルーティング情報を便利にRedux状態に追加できますが、_react-router-redux
_からPush
を使用することもできます。dispatch(Push('/dashboard'))
_import { Push } from 'react-router-redux'
_でアクセスできます
fetch
呼び出しをヘルパー関数で抽象化します。承認後にアクセストークンを今後のすべてのリクエストに追加する必要があると思います。ヘルパー関数を使用すると、より簡単にコードをクリーンに保つことができます。window.location.href
はサーバーにヒットし、単一ページアプリケーションのすべての利点を失います。履歴オブジェクトではなくクライアント側ルーティングを使用する必要があります
このシナリオでは、履歴を含む最初のディスパッチをトリガーするコンポーネントからコールバックを渡すのが良い解決策です。新しい状態にプッシュします
例えば.
コンポーネントの小道具内で履歴にアクセスできると仮定します
login(body, () => {
this.props.history.Push('/dashboard');
})
window.location.href = ${app}/dashboard
の代わりにコールバックを呼び出します