J'ai plusieurs magasins Pinia qui sont censés partager un ensemble d'opérations et de getters, mais je ne sais pas trop comment y parvenir efficacement.
Je développe une application qui permet aux utilisateurs de gérer de nombreux médias différents (livres, films, émissions de télévision, etc.). La façon dont j'y pense actuellement est d'avoir un magasin pour chaque type de média, tel que BookStore, MovieStore, etc. De nombreux getters et opérations (comme count
和 deleteOne
) sont exactement les mêmes entre ces différents magasins.
Comment implémenter DRY ici ? Les exemples de la documentation Pinia se concentrent sur la réutilisation d'actions et de getters dans d'autres magasins, mais je ne pense pas que cela réponde pleinement à mon cas d'utilisation consistant à hériter directement d'un ensemble de getters et de setters.
L'approche successorale que j'essaie ici est-elle un anti-modèle ?
Si vous souhaitez que certaines fonctionnalités ne soient pas partagées dans tous les magasins, vous pouvez utiliser composable.
Vous pouvez créer une fonction composable distincte et y transmettre une partie de l'instance du magasin.
J'ai fait un exemple pour vous sur codesandbox.
Voici un court exemple de codesandbox :
common.ts
Ensuite, dans n'importe quel magasin, vous pouvez l'utiliser comme ceci :
fooStore.ts
De cette façon, vous pouvez composer n'importe quelle fonction, objet, etc. dans n'importe quel stockage ou dans n'importe quel composant.
Cela peut être réalisé à l'aide de plugins docs
Exemple de film :
Vous possédez plusieurs magasins, chaque état utilisant un schéma de dénomination partagé :
Chaque magasin aura les mêmes opérations CRUD, seule l'URL change
Créer un plugin :
Fournir des plugins pour Pinia :
Exemple movieStore.js (utilisant des actions et un état partagés)
Exemples d'utilisation dans les composants
Editeur : 1
Si vous transmettez le contexte dans le plugin, vous pouvez accéder au magasin et aux options qui y sont transmises, à partir desquelles vous pouvez vérifier l'ID du magasin et renvoyer uniquement le magasin spécifique comme indiqué ci-dessous
J'ai créé un exemple très basique utilisant 3 magasins, le chèque ci-dessus est disponible dans codesandbox ici