Je vais migrer vers Redux.
Mon application se compose de nombreuses parties (pages, composants) donc je souhaite créer de nombreux réducteurs. Les exemples Redux montrent que je devrais utiliser combineReducers()
pour générer un réducteur.
Aussi, si je comprends bien, l'application Redux devrait avoir un magasin et il est créé une fois que l'application démarre. Lorsque le magasin est en cours de création, je devrais passer mon réducteur combiné. Cela a du sens si l'application n'est pas trop grande.
Mais que faire si je construis plus d'un bundle JavaScript? Par exemple, chaque page d'application possède son propre bundle. Je pense que dans ce cas, le réducteur combiné n'est pas bon. J'ai regardé à travers les sources de Redux et j'ai trouvé la replaceReducer()
fonction. Cela semble être ce que je veux.
Je pourrais créer un réducteur combiné pour chaque partie de mon application et l'utiliser replaceReducer()
lorsque je me déplace entre les parties de l'application.
Est-ce une bonne approche?
la source
/homepage
, puis une plus grande partie de cette branche est chargée lorsque l'utilisateur accède à leurprofile.
Un exemple de la façon dont pour ce faire, ce serait génial. Sinon, j'ai du mal à aplatir mon arbre d'état ou je dois avoir des noms de branche très spécifiquesuser-permissions
etuser-personal
C'est ainsi que je l'ai implémenté dans une application actuelle (basé sur le code de Dan à partir d'un problème GitHub!)
Créez une instance de registre lors du démarrage de votre application, en passant des réducteurs qui seront inclus dans le bundle d'entrée:
Ensuite, lors de la configuration du magasin et des routes, utilisez une fonction à laquelle vous pouvez attribuer le registre du réducteur:
Où ces fonctions ressemblent à quelque chose comme:
Voici un exemple de base en direct qui a été créé avec cette configuration, et sa source:
Il couvre également la configuration nécessaire pour activer le rechargement à chaud de tous vos réducteurs.
la source
Il existe maintenant un module qui ajoute des réducteurs d'injection dans le magasin redux. Il s'appelle Redux Injector .
Voici comment l'utiliser:
Ne combinez pas de réducteurs. Placez-les plutôt dans un objet (imbriqué) de fonctions comme vous le feriez normalement, mais sans les combiner.
Utilisez createInjectStore depuis redux-injector au lieu de createStore depuis redux.
Injectez de nouveaux réducteurs avec injectReducer.
Voici un exemple:
Divulgation complète: je suis le créateur du module.
la source
Depuis octobre 2017:
Reedux
met en œuvre ce que Dan a suggéré et rien de plus, sans toucher à votre magasin, votre projet ou vos habitudes
Il existe également d'autres bibliothèques mais elles peuvent avoir trop de dépendances, moins d'exemples, une utilisation compliquée, sont incompatibles avec certains middlewares ou vous obligent à réécrire votre gestion d'état. Copié de la page d'introduction de Reedux:
la source
Nous avons publié une nouvelle bibliothèque qui aide à moduler une application Redux et permet d'ajouter / supprimer dynamiquement des réducteurs et des middlewares.
Veuillez jeter un œil à https://github.com/Microsoft/redux-dynamic-modules
Les modules offrent les avantages suivants:
Les modules peuvent être facilement réutilisés dans l'application ou entre plusieurs applications similaires.
Les composants déclarent les modules dont ils ont besoin et redux-dynamic-modules garantit que le module est chargé pour le composant.
Caractéristiques
Exemples de scénarios
la source
Voici un autre exemple de partage de code et de magasins redux, assez simple et élégant à mon avis. Je pense que cela peut être très utile pour ceux qui recherchent une solution efficace.
Ce magasin est un peu simplifié, il ne vous oblige pas à avoir un espace de noms (reducer.name) dans votre objet d'état, bien sûr, il peut y avoir une collision avec les noms mais vous pouvez contrôler cela en créant une convention de dénomination pour vos réducteurs et cela devrait être bien.
la source