2017-07-25 3 views
0

J'ai un sélecteur qui obtient le type de filtre actuel de store (filterSelector).
Et 3 de plus, qui filtrent les entités du magasin en utilisant une logique différente, imaginons que leurs noms sont smallEntitiesSelector, mediumEntitiesSelector, bigEntititiesSelector.Définir le sélecteur de manière dynamique en fonction du résultat précédent sélection

Quelle est la meilleure façon de créer un sélecteur, ce qui retournera les entités filtrées en fonction des valeurs de filtre stockées?

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

Pour cet exemple particulier, je voudrais créer un sélecteur, qui accepte le paramètre de filtre, mais en cas réel je logique plus complexe dans ce sélecteurs et je ne veux pas les mélanger.

UPD: En raison de la demande dans les commentaires Je vais ajouter un peu plus de code. Voici une façon que je fais le travail:

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; 
    } 

)

Mais je n'aime pas cette solution, parce que tous les 3 sélecteurs seront exécutés à chaque fois que des entités originales ont changé, alors que je dois seul à être exécuté. Donc, ça marche, mais j'ai l'impression qu'il y a un moyen de faire mieux. Dans un premier temps, vous pouvez configurer 2 sélecteurs pour dériver le filtre actuel et les données d'entités actuelles.

+0

Quel est le comportement attendu et pourquoi votre solution ne fonctionne pas pour vous? –

+0

Comportement attendu: Je souhaite obtenir le résultat d'un de mes sélecteurs en fonction du résultat de la sélection de filterType. Ma solution ne devrait pas fonctionner du tout c'est juste une sorte d'illustration pour la question. Si vous mettez la fonction de sélecteur au lieu de points d'interrogation (smallEntitiesSelector au lieu de ??? pour le premier cas) - vous obtiendriez ce sélecteur à la suite de filterEntities selector, alors que je veux obtenir le résultat de smallEntitiesSelector – ilyabasiuk

+0

Cela ressemble plus à un problème liés à la langue puis les bibliothèques lui-même. S'il vous plaît fournir votre code. –

Répondre

1

Ensuite, appelez le sélecteur approprié directement dans le 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? 
    } 
); 

Si vous entrez dans les problèmes de performance d'invalidation/cache, re-reselect peut vous aider.

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

Mais la mémorisation fonctionnera-t-elle avec un tel sélecteur small/medium/bigEntities? – ilyabasiuk

+0

Dans ce cas, le cache est invalidé lorsque les résultats de 'filterSelector' ou' entitiesSelector' diffèrent de l'appel précédent. –