2016-09-04 30 views
1

我有一個Redux應用程序,它顯示基於一組過濾器(用戶輸入)的屬性列表。Redux - 減速器取決於其他狀態

我的狀態的簡單描述:

  1. filters - 過濾值的對象...
  2. properties - 頁面上可用的所有屬性的回購
  3. visibleProperties - 與當前的過濾器屬性列表應用

問題是我在調度&時設置了一個新的過濾值,我需要過濾properties基於filters新狀態並將結果存儲在visibleProperties中。

所以我想出了這個解決方案:

export function setBedroomFilter (value) { 
    return (dispatch, getState) => { 

    // 'SET_FILTER' action 
    dispatch(setFilter('bedroom', parseInt(value))) 

    // New state 
    const { filters, properties } = getState() 

    // 'FILTER_PROPERTIES' action (Depending on new state) 
    dispatch(filterProperties(properties, filters)) 
    } 
} 

而且visibleProperties減速機可以做的工作:

// case 'FILTER_PROPERTIES'... 
visibleProperties = action.properties.filter(item => item.bedroom >= action.filters.bedroom) 

是這種做法完全好?

+1

意見建議:這聽起來像是您在redux商店中複製了您的屬性。你應該在redux中存儲唯一的_filter state_,並在容器級執行_actual_過濾。你不必派遣另一個動作來過濾,因爲容器會自動過濾掉根據道具傳遞的屬性(過濾器和屬性)。 – thgaskell

+0

謝謝,很好的建議。不過,我爲了這個問題簡化了我的例子。我有'重複''屬性'狀態的原因,是因爲其中一個_keeps_基於當前過濾器序列化的過濾列表的緩存版本。所以(我認爲)我無法按照你的建議(在容器中過濾)做,因爲我會丟失特定的過濾列表,並且如果稍後應用相同的過濾器,將不得不再次過濾。因此,我調用一個(更多)動作來過濾「屬性」並將結果緩存在所謂的重複「屬性」狀態中。是否有意義? – eightyfive

回答

1

dispatch文檔:

調度動作。這是觸發國家變革的唯一途徑。

商店的縮小功能將與當前的 getState()結果和給定動作同步調用。其返回值 將被視爲下一個狀態。從現在開始,它將從getState() 返回,並立即通知更改偵聽器。

這是一個同步功能,並且按照您所描述的方式使用是完全正常的(只要setFilter是同步的)。但是,如果你在做setFilter異步操作(假設無極從使用setfilter返回)您應鏈中的調度呼叫是這樣的:

dispatch(setFilter('bedroom', parseInt(value))).then(() => { 
    // New state 
    const { filters, properties } = getState() 

    // 'FILTER_PROPERTIES' action (Depending on new state) 
    dispatch(filterProperties(properties, filters)) 
} 

另一種選擇可能是使用選擇。請查看: https://github.com/reactjs/reselect