2017-10-17 1 views
0

J'effectue une validation de base dans un créateur d'actions liées.Dispatch conditionnel en action Créateurs

const mapDispatchToProps = { 
    onSomething: (props) => { 
     if (performValidation(props)) { 
      return { type: 'SOME_ACTION' }; 
     } 
    } 
}; 

Si la validation échoue et que je ne renvoie pas d'action à expédier, j'ai reçu l'erreur.

Les actions doivent être des objets simples. Utilisez un middleware personnalisé pour les actions asynchrones.

Est-ce normal? Je peux contourner le problème en utilisant un thunk, mais cela semble excessif pour la répartition conditionnelle non-asynchrone.

Répondre

2

Non, les thunk sont la bonne approche ici. Lorsqu'un créateur d'action est lié, il est appelé et la sortie est transmise directement à dispatch. Mettre la logique conditionnelle dans un créateur d'action "simple" signifie qu'il peut retourner undefined, et ainsi faire dispatch(undefined). Par conséquent, si vous avez besoin d'un envoi conditionnel, n'utilisez pas un créateur d'action lié et gérez la logique conditionnelle dans le composant, ou envoyez un thunk et conservez la logique conditionnelle dans le thunk. Pour moi, c'est un bon cas d'utilisation pour un thunk.

+0

Je pensais autant. Ne devrait pas expédier simplement ignorer indéfini. Cela permettrait l'envoi conditionnel comme ci-dessus sans middleware requis. – madcapnmckay

+0

Non. Le contrat pour 'dispatch()' est que toute autre chose qu'un simple objet JS atteignant le réducteur est considérée comme une erreur, point. Les intergiciels peuvent "apprendre" à "envoyer" pour accepter des valeurs d'objet non-simple en les empêchant d'atteindre les réducteurs, ou en les transformant en cours de route. 'redux-thunk' recherche les fonctions, les appelle et ne les transfère pas le long du pipeline de middleware. Vous pouvez facilement écrire un middleware pour capturer des valeurs non définies, mais cela est distinct du comportement de contrat API de la base de données. – markerikson