2016-09-28 30 views
1

比方說,我有大量的JSON數據,我最初希望顯示在頁面加載(到目前爲止)以及篩選該數據以顯示特定數量的選項。當我的FILTER_DATA動作被分派時,它會檢查view屬性並執行幫助器函數來過濾數據數組,以便儘可能多地顯示數據。Redux:在Reducer中過濾數據並回捲到初始數據狀態?

但是......如果我用數據的過濾版本更新狀態,並假設用戶想要返回到原始視圖(整個數據集),是否有一種方法可以回滾狀態到那一點?我正在考慮重新調度FETCH_DATA行動來重新執行GET請求來再次獲取數據,但這似乎令人討厭。思考? 下面是我的減速機:

注:data的初始化狀態對象爲空數組的值,直到FETCH_DATA_SUCCESS調度,並設置給state.data在GET請求獲取的JSON數據。

const app = (state = initialState, action) => { 
    switch(action.type) { 
    case FETCH_DATA: 
     return { ...state, error: '', loading: true }; 
    case FETCH_DATA_SUCCESS: 
     return { ...state, error: '', loading: false, data: action.data, view: 'all' }; 
    case FETCH_DATA_FAILURE: 
     return { ...state, error: action.error, loading: false }; 
    case FILTER_DATA: 
     let data; 
     if (action.view === 'week') { 
     data = groupData(getLastWeek(state.data), action.view); 
     } else if (action.view === 'month') { 
     data = groupData(getLastMonth(state.data), action.view); 
     } else if (action.view === 'all') { 
     data = state.data; 
     } 
     return { ...state, error: '', loading: false, data: data, view: view }; 
    } 
    return state; 
} 

謝謝。

回答

3

有兩個主要選項。首先,如果您確實希望將「過濾」數據直接保存在您的狀態中,則可以存儲兩個副本:「原始」和「已過濾」版本。

我推薦的另一種方法是將原始數據和過濾標準保持在您的狀態,但不實際修改原始數據。相反,根據需要在商店外派生過濾。這對於「選擇器功能」來說是一個很好的用例。有些例子參見http://redux.js.org/docs/recipes/ComputingDerivedData.html

相關問題