2016-09-04 107 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