2016-07-20 51 views
2

我正在使用Redux來管理我的應用程序狀態,並使用redux-thunk進行了異步操作。無需調度即可運行redu縮活動

export const login = credentials => dispatch => { 
    return doLogin(credentials).then(token => { 
     localStorage.setItem('token', token) 
     // this dispatch call was there before, but now it has gone, 
     // because it is not necessary anymore 
     // dispatch({ type: LOGIN_SUCCESS }) 
    }) 
} 

的事情是,現在我已經不派遣任何行動統一到店的行動,只是沒有關於登錄和存儲令牌其工作。

可以採取這種行動嗎?我對這段代碼並不感到自信,但我不知道如何讓它變得更好。

+0

這個函數不會對狀態做任何事情嗎? –

回答

1

對於沒有硬性規則的東西,您要求提供意見,但根據經驗,操作應該是對應用程序中發生的事情的最低限度描述。

Thunkified行爲通常是這種行爲的解決方法,但在這種情況下可以採取這種行動,因爲即使它不通過reducer對Redux狀態產生影響,您正在使用(thunk )中間件來執行副作用,中間件被設計爲響應行動。

事實上,您觸發未被減速器下游消耗的'上游'操作並不重要,儘管在開始時仍然可以使用dispatch({ type: 'LOGIN_REQUEST' }),最後使用dispatch({ type: 'LOGIN_SUCCESS'})因此下游應用程序有辦法知道發生了什麼,如果它想在以後做一些事情。

1

這是味道的問題,但我個人不會將您的動作創建者與其效果(在本地存儲中設置的項目)緊密結合。

相反,我會派遣一個動作,例如,將令牌傳入的LOGIN_SUCCESS作爲其數據。然後有一個處理該動作類型的中間件 - 即將令牌設置在本地存儲中。

這樣你就可以爲自己提供更多的靈活性,當涉及到如何處理由doLogin返回的證書時。你應該追求每個軟件做這件事情的做法,做得最好。所以你有一個功能來驗證用戶,然後將認證令牌交給另一個知道如何處理它的片段。

+0

你對中間件可能是正確的。但localStorage僅用於該功能,所以我認爲僅爲這種情況添加中間件會很麻煩。 –

+0

我想是這樣,但仍然分開的擔憂更容易推理。總而言之 - 這是一個選擇的問題。 – WTK