2016-05-03 86 views
8

當涉及到在REDX世界中執行任務的「正確」方式時,我有很多困惑。假設我有一個reducer,它擁有foos列表,並且這些foos可以完全加載服務器關於foo或僅部分加載的所有信息。REDX從狀態獲取項目或從服務器獲取

在應用程序中,我有兩個視圖/狀態,一個是我有一個foos列表,另一個是我查看單個foo的詳細信息。

當我查看foo的詳細信息時,我想通過幾個階段來確定是否需要從服務器獲取哪些數據。這個決定過程是這樣的:

1)我已直接導航到foo的詳細信息視圖。 Theres沒有關於這個foo的redux存儲,我想從服務器上檢索關於foo的全套信息。

2)我在前面打,我檢索有關foo的部分信息列表視圖,當我查看詳細信息查看我只想取我缺少的是富

3)我以前的附加信息看到一個項目的foo視圖,所以我需要的信息已經在redux存儲中,因此不需要從服務器獲取任何其他內容。

現在忘記了redux存儲中的數據將需要刷新(如果失效)這一事實。我很困惑我如何通過有條件地分派行動來實現這三件事情。我基本上想調度行動部分或完全檢索數據並設置顯示選定的項目。

當我在細節視圖中時,我可以將foo從商店直接連接到道具如果我有我需要的所有信息。如果沒有,我需要調度一個動作來完全或部分檢索我的foo數據的附加數據。在這個動作的背後已經完成,reducer將完全完整的foo添加到我的狀態foo的列表中,然後我想找到合適的並將其分配給組件的props/state。

雖然我理解了我需要實現的部分,但我不知道何時何地我應該完成此過程的每個部分。

爲了方便起見,我們假設每個foo都有一個id,因此在我的狀態下查找foo是由該id進行篩選。

希望這是有道理的,任何幫助的歡迎,並有任何常見的模式,這種「從本地狀態緩存獲取或回落到服務器,如果失蹤」的概念。

克里斯

回答

4

可以異步行動的創建者中檢查當前Redux的狀態,然後有條件地更新狀態。因此,無論何時您需要從服務器更新本地狀態,請派遣操作創建者並讓其處理決策。你可以在componentDidMount中這樣做。如果您使用終極版咚,你可以這樣傳遞當前的狀態:

export default function fetchFooBar() { 
    return (dispatch, getState) => { 
     const state = getState(); 

     if (! state.foo.bar) { 
      // fetch and dispatch 
     } 
    } 
} 
+0

謝謝,我知道我可以在'componentDidMount'檢查狀態,然後有條件派遣如果它不存在。但是這個調度的結果會在我的狀態中添加一個項目到列表中。我是否還需要注意對列表的更改,以便在添加項目時我有興趣顯示詳細信息以便更新組件狀態? – Owen

+0

假設你正在連接你的組件(使用'react'中的connect''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''¡您只需輸出組件的'render'函數中可用的任何redux狀態。那是你在找什麼? –

+0

謝謝里克,是的,我認爲如此,但似乎有可能發生的競爭條件問題。由於獲取項目的請求是異步的,因此在裝入組件並檢查狀態之前可能尚未完成,因此最終會派發另一個提取。當我所能做的只是檢查狀態時,你通常會做什麼來確保請求已完成。你的狀態會有一些「取/抓」類型的標誌嗎? – Owen