我在使用redux和反應路由器進行身份驗證時遇到了一些麻煩,希望對如何最好地解決我的問題進行一些說明。Universal Auth Redux&React路由器
我有一個登錄組件,提交時調度以下動作:
export const loginUser = (creds) => {
return dispatch => {
dispatch(requestLogin(creds))
return fetch('http://127.0.0.1:4000/api/login', {
...
})
.then(res => {
dispatch(receiveLogin())
browserHistory.push('/admin')
...
})
...
}
}
的receiveLogin行動更新isAuthenticated標誌的狀態設置爲true。我的保護路由有以下的OnEnter鉤:
export default (state) => {
return {
path: '/',
component: App,
childRoutes: [
{
path: 'protected',
component: Protected,
...
onEnter(nextState, replaceState) {
const loggedIn = //check state.isAuthenticated
if (!loggedIn) {
replaceState(null, 'login')
}
}
}
]
}
}
正如你所看到的,我傳遞的狀態作爲參數。這使我可以訪問服務器以及客戶端的初始狀態。但是,在我的登錄操作發生後,顯然onEnter鉤子仍將使用初始狀態。
我想知道的是在更新isAuthenticated標誌之後獲取當前狀態的最好方法,而不是在我的onEnter掛鉤中使用它。或者,我的方法是否完全有缺陷,我是否應該以完全不同的方式完成這項工作?
我和Andrew有類似的問題,但我使用HOC。我的問題是用戶無法登錄,因爲它始終在響應從服務器返回之前檢查當前狀態 - 這意味着用戶無法登錄。有沒有辦法在redux商店中限制支票? – Abdi
@Abdi是啊我在這裏遇到過類似的問題:https://github.com/mjrussell/redux-auth-wrapper/issues/30。我認爲解決方案只是添加一個標誌到你的redux商店(isUserFetched)或類似的東西,如果是的話 - 而不是執行重定向,在HOC中顯示一個替代頁面,而不是包裝組件。 (如加載頁面)。我想很快添加到我的圖書館,只是還沒有時間 – mjrussell
我實際上設法解決問題,而不訴諸在中間頁面。我使用了redux-thunk - 這讓行動等待解決,然後我更新狀態,然後重定向。希望這是有道理的,但如果你有類似的問題,一定要看看[redux-thunk](https://github.com/gaearon/redux-thunk)。我還發現這個回購非常有幫助,因爲它正在做我想實現的[HOC with authentication](https://github.com/joshgeller/react-redux-jwt-auth-example) – Abdi