2017-07-25 39 views
0

我有选择器从存储(filterSelector)获取当前的过滤器类型。
另外还有3个使用不同逻辑的商店过滤实体,让我们假设他们的名字是smallEntitiesSelector,mediumEntitiesSelector,bigEntititiesSelector。根据结果先前的选择动态地定义选择器

什么是创建选择器的最佳方式,它将根据存储器中的过滤器值返回过滤的实体?

const filteredEntities = createSelector(
    filterSelector, 
    (filterType) => { 
     switch filterType: 
      case "small": ??? 
      case "medium": ??? 
      case "big": ??? 
    } 
) 

对于这个特殊的例子中,我将创建一个选择,它接受过滤参数,但在现实情况下,我有这样的选择中更复杂的逻辑,我不想将它们混合。

UPD: 由于评论中的请求,我会添加更多的代码。这是一种方法,我如何让它工作:

const filteredEntities = createSelector(
    filterSelector, 
    smallEntitiesSelector, 
    mediumEntitiesSelector, 
    bigEntititiesSelector, 
    (filterType, smallEntities, mediumEntities, bigEntities) => { 
     switch filterType: 
     case "small": return smallEntities; 
     case "medium": return mediumEntities; 
     case "big": return bigEntities; 
    } 

但我不喜欢这样的解决方案,因为所有3个选择每次都会原来的实体变被执行,而我只需要一个被执行。所以TI的工作,但我觉得有一种方法可以做得更好。

+0

什么是预期行为以及您的解决方案为何不适合您? –

+0

预期行为:我想根据filterType选择的结果得到我的一个选择器的结果。 我的解决方案根本无法解决问题。 如果你把选择器功能而不是问号(smallEntitiesSelector而不是第一种情况下) - 你会得到这个选择器作为filteredEntities选择器的结果,而我想要得到的结果smallEntitiesSelector – ilyabasiuk

+0

它看起来像一个问题更多与语言有关的话就是图书馆自己。请提供您的代码。 –

回答

1

作为第一次尝试,您可以设置2个选择器来导出当前过滤器和当前实体数据。然后,直接拨入result function

const filteredEntities = createSelector(
    filterSelector, 
    entitiesSelector, // Todo 
    (filterType, entities) => { 
     switch filterType: 
      case "small": return smallEntities(entities); 
      case "medium": return mediumEntities(entities); 
      case "big": return bigEntities(entities); 
      // case default? 
    } 
); 

如果你进入性能/缓存失效的问题,re-reselect可以帮助你。

import createCachedSelector from 're-reselect'; 

const filteredEntities = createCachedSelector(
    filterSelector, 
    entitiesSelector, // Todo 
    (filterType, entities) => { 
     switch filterType: 
      case "small": return smallEntities(entities); 
      case "medium": return mediumEntities(entities); 
      case "big": return bigEntities(entities); 
      // case default? 
    } 
)(
    filterSelector 
); 
+0

但是记忆会在这种实现中起作用吗?小/中/大实体选择器? – ilyabasiuk

+0

在这种情况下,当“filterSelector”或“entitiesSelector”结果与先前的调用不同时,缓存将失效。 –