Dois-je conserver les références de fonction dans Redux magasin?
Je suis en train de construire raccourci clavier de soutien dans mon Réagir/Redux app dans un idiomatiques Réagir/Redux façon. La façon dont j'ai prévu de le faire c'est avoir l'action suivante, le créateur et associé de l'action:
registerShortcut(keyCode, actionCreatorFuncReference)
Le réducteur serait alors de mettre à jour un registeredShortcuts objet dans le redux magasin avec un mappage de touches à actionCreatorFuncReferences. Puis mon composant racine serait à l'écoute pour keyup et voir s'il est associé à un mot de code enregistré, et si oui, alors l'envoi de l'mappé action via l'action créateur de la fonction de référence.
Cependant, ce serait la première fois que je suis stocker des références de fonction dans mon Redux magasin. À ce jour, je n'ai eu que des objets avec des touches à la vanille, avec des valeurs (chaînes de caractères, entiers, etc).
Le Redux docs dit "Vous devriez faire de votre mieux pour maintenir l'état serializable. Ne rien mettre à l'intérieur que vous ne pouvez pas facilement se transformer en JSON.". Cela suggère que c'est une mauvaise idée de stocker ces références de fonction dans mon Redux magasin? Si oui, quelle est la meilleure façon d'accomplir ce que je suis en train de faire à Réagir/Redux?
Une approche alternative est juste pour stocker la cartographie des codes de touche et la fonction des références à la racine de réagir composant lui-même, mais qui ne se sent pas très Redux-comme depuis maintenant l'état de l'application n'est pas dans le Redux magasin.
- J'ai sorte de me demandais à propos de ce genre de chose moi-même. Alors que Redux état doit absolument être sérialisable, il y a d'autres choses que vous pourriez vouloir conserver à la fois (des promesses, etc). J'ai juste soulevé cette question au cours de github.com/rackt/redux/issues/1385 - nous allons voir si quelque chose arrive.
Vous devez vous connecter pour publier un commentaire.
Non, vous ne devez pas stocker les références de fonction dans le redux magasin. Ils ne sont pas sérialisables, et comme vous l'avez mentionné l'état doit être sérialisable à tous les temps. La plupart redux approche amicale, je pense, juste pour garder la carte de raccourcis dans leurs actionCreatorFuncNames.
actions
objet partout où vous êtes la manipulation de ces événements clés. Le plus dur est de mettre en contexte le bouton de la presse et de l'appel deactions[actionCreatorFuncNameA]
avec les arguments appropriés. D'autre part, si les raccourcis sont tout bascule, alors vous n'avez pas besoin d'appeler tous les arguments et le problème est résolu. Cela fait sens, ou suis-je à côté de la plaque?TL;DR: Vous n'avez pas. Le magasin de l'etat doivent être sérialisables à tous les temps (que Nathan a répondu).
Le Redux est via les exhausteurs de, ou le Redux Observables par dépendances.
Basé sur le Redux docs exemple, ce que vous voulez, c'est de passer la référence de votre action(1), de l'ignorer votre réducteur(2) et à utiliser dans votre enhancer(3):
Remarque: aussi loin Qu'il n'y a pas d'effets secondaires dans vos amplificateurs, vous êtes bon pour aller. Soyez conscient que vous pourriez avoir obtenu les refs directement dans les réducteurs, mais une telle approche maintient la référence à l'réducteur de niveau et rate le point de
combineReducers()
. Avec un amplificateur, vous les gardez tous en un seul endroit(myRefStore
). Une dernière observation est qu'un redux magasin n'est pas un tout-magasin de données, mais un magasin d'état, donc pourquoi nous devons nous occuper des fonctions et d'autres non-état des choses dans des amplificateurs. Vous pouvez tirer parti de la mise en réseau de base pour les Redux Observables et injectermyRefStore
via dépendances.Je suis nouveau sur redux, mais la façon dont je le vois, vous pourriez passer le code de la clé et un type d'action.
Puis un réducteur pourrait être à l'écoute pour ce type d'action et apporter des modifications en conséquence.
Voici un exemple d'utilisation de la bibliothèque Souricière:
De cette façon, les raccourcis clavier enverra une action. Le réducteur d'effectuer les changements nécessaires à l'état. Et enfin, l'application peut ré-rendu.
J'ai eu de très bons résultats en ajoutant des fonctions de mon redux magasin. Si vos fonctions agissent comme des méthodes à appliquer la logique aux données, il peut être incroyablement puissant tout au long de votre application (plus JSON.stringify enlèvent les fonctions, de toute façon, de sorte que vous pouvez toujours sérialiser votre magasin et de l'enregistrer pour le stockage local ou que ce soit.) Ci-dessous j'ai un currentUser réducteur qui utilise une classe de l'état initial, et comprend un hasPermissions méthode qui peut être appelé n'importe où le currentUser est connecté. C'est particulièrement agréable car chaque fois que j'carte currentUser de mes accessoires, je n'ai pas besoin de rappeler à l'importation de certains types de util qui va analyser l'utilisateur de voir si il a les autorisations pour afficher quelque chose. La méthode est déjà sur l'utilisateur.