2016-05-23 84 views
0

我有一個大的json數據集產品,我稱之爲產品真相源。使用一些過濾,我必須過濾這個數據集並返回與過濾器匹配的產品的子集。我可以使用不同的過濾器,它應該從真相源返回一個子集。過濾器可以是(1)在標題(2)產品中具有關鍵字'javascript'的產品,其價格大於10美元。我也可以添加一個新的產品來解釋這個事實。我可以再次應用篩選器,新添加的產品可能會返回結果子集。返回部分狀態

我看到的所有reducer示例都從前一個狀態返回一個狀態。所以,就我而言,如果遵循減速原理,我可以在產品真假源上應用一個過濾器,並獲得新的狀態。現在,如果我應用另一個過濾器,我只能將其應用於新狀態,而不能應用於真相源。所以,過濾器是在已經過濾的產品狀態下完成的。

我想過濾器適用於原始/主產品的真相源。我不希望過濾器應用於已經過濾的狀態。

有人可以幫忙嗎?

回答

1

您可以製作一段叫做fullData的狀態來保存整個大型的JSON數據集,然後您的過濾器可以調用一個將fullData的子集調度爲filteredData(一個單獨的狀態)的動作嗎?如果filteredData不存在,則可以創建一個呈現fullData的函數,否則將呈現filteredData。這可能不是最優雅的解決方案,但我認爲它會起作用。

製作一個叫做FILTER_RESULTS的'type',也許吧。然後,你在你的行動的創建者文件中創建一個動作:

export function filterResults(fullData) { 
// javascript here to filter results 
return { 
    type: FILTER_RESULTS, 
    payload: <variable containing filtered results> 
}; 
} 

那麼你的減速將有一個switch語句,將action.payload回到filteredData件狀態。

您的操作執行過濾,將過濾的結果傳遞給reducer,並且您的mapStateToProps允許組件訪問您的狀態。看看這裏:https://github.com/joshuaslate/mern-starter

+0

哪裏可以完成過濾?在redurs或** MapStateToProps **函數中? –

+0

我修改了我的答案以供澄清,但請參閱我添加的鏈接。它會向您展示動作創作者,減速器和連接工作的基本示例。 –

+0

您的解決方案建議有兩種不同的狀態 - 主狀態和子狀態。 Abhinav的解決方案是隻使用一個狀態,並且不會爲新狀態使用redux存儲。這是一個用戶界面的問題,所以在UI中進行管理。 –

1

如果要在component本身的客戶端sidem上執行數據過濾邏輯,因爲它是"transient state"

說,如果你有一個Container組件,它具有數據,並呈現以下組件:

  1. Filter組件 - 渲染過濾器部分,在這裏我們選擇這樣的過濾器。
  2. WorkspaceView組件 - 渲染實際視圖與數據,我們在哪裏看到數據。

然後你Container組件將篩選基於由Filter組件發送的filters數據本身和對數據傳遞給WorkspaceView

我不認爲Redux應該在以下情況下可使用這樣的「臨時」狀態,並且應該僅在從後端或其他事物提供數據的情況下使用。