La Communication entre frère composants dans VueJs 2.0
Dans vuejs 2.0 model.sync
sera obsolète.
Donc, ce qui est un bon moyen de communiquer entre frère composants dans vuejs 2.0?
Que je rattrape l'idée en Vue 2.0 est d'avoir de frère, de la communication à l'aide d'un magasin ou d'un événement de bus.
Selon evan:
Il est également intéressant de mentionner "le passage des données entre les composants" est
généralement une mauvaise idée, parce qu'à la fin du flux de données devient
untrackable et très difficiles à déboguer.Si un morceau de données qui doit être partagée par plusieurs composants, préfèrent
mondial de magasins ou Vuex.
Et:
.once
et.sync
sont obsolètes. Les accessoires sont maintenant toujours un chemin vers le bas. Pour
produire des effets secondaires de la portée parent, un composant doit
explicitementemit
un événement au lieu de s'appuyer sur l'implicite de liaison.
(Donc, il suggérer est d'utiliser $emit
et $on
)
Je suis inquiet à cause de:
- Chaque
store
etevent
a une visibilité à l'échelle mondiale (corrigez-moi si je me trompe); - C'est pour beaucoup à créer une nouvelle banque pour chaque mineur de communication;
Ce que je veux, c'est portée en quelque sorte events
ou stores
visibilité pour les frères et sœurs des composants. Ou peut-être que je n'ai pas compris l'idée.
Alors, comment communiquer dans un droit chemin?
$emit
combiné avecv-model
pour émuler.sync
. je pense que vous devriez aller le Vuex façon- Donc j'ai pensé à la même préoccupation. Ma solution est d'utiliser un événement de l'émetteur à un canal de diffusion qui est l'équivalent de "champ d'application" - c'est à dire un enfant/parent et frère de configuration utilisez le même canal de communication. Dans mon cas, j'utilise la radio de la bibliothèque radio.uxder.com parce que c'est juste quelques lignes de code et de ses pare-balles, mais beaucoup choisissent de nœud EventEmitter.
Vous devez vous connecter pour publier un commentaire.
Avec Vue 2.0, je suis en utilisant le eventHub mécanisme tel que démontré dans le la documentation.
Définir centralisée des événements hub.
Maintenant dans votre composant, vous pouvez émettre des événements avec
Et à écouter vous ne
Mise à jour
Veuillez voir la réponse par @alex, qui décrit plus simple solution.
this.$root.$emit()
etthis.$root.$on()
Vous pouvez même en faire plus court et l'utilisation racine
Vue
instance comme Événement mondial Hub:Composante 1:
Composante 2:
Je sais que c'est une vieille question, mais je voulais exposer d'autres canaux de communication et la manière de voir de l'application et de la communication à partir d'un point de vue plus élevé.
Types de Communication
La première chose à comprendre lors de la conception d'une Vue de l'application (ou, en fait, n'importe quel composant en fonction de l'application) est qu'il existe différents types de communication qui dépend des préoccupations que nous avons affaire à et ils ont besoin de leurs propres canaux de communication.
Logique d'entreprise: fait référence à tout ce spécifique à votre application et à son objectif.
Logique de présentation: rien de ce que l'utilisateur interagit avec ou résultant de l'interaction de l'utilisateur.
Ces deux préoccupations sont liées à ces types de communication:
Chaque type doit utiliser le bon canal de communication.
Canaux de Communication
Un canal est un terme général que je vais utiliser pour se référer à des implémentations concrètes pour l'échange de données autour d'une Vue app.
Accessoires (Présentation de la logique)
Le plus simple canal de communication en Vue directe Parent-Enfant de la communication. Il doit surtout être utilisé pour transmettre des données relatives à la présentation de la logique ou d'un ensemble limité de données au bas de la hiérarchie.
Refs et les méthodes (Présentation de la logique)
Quand il ne fait pas de sens d'utiliser un support pour permettre à un enfant de gérer un événement à partir d'un parent, la configuration d'un
ref
sur le composant enfant et en appelant ses méthodes est tout simplement parfait.Certaines personnes peuvent dire que c'est un couplage étroit entre le parent et l'enfant, mais c'est le même couplage de l'aide d'accessoires. Si nous pouvons être d'accord sur un contrat d'accessoires, nous pouvons convenir d'un contrat pour l'utilisation de méthodes.
Événements (Présentation de la logique)
$emit
et$on
. Le plus simple canal de communication direct de communication entre Parents et Enfants. De nouveau, doit être utilisé pour la présentation de la logique.Événement de bus (les Deux)
La plupart des réponses donner de bonnes alternatives pour bus d'événement, qui est l'un des canaux de communication disponibles pour les composants, ou quoi que ce soit en fait.
Cela peut être utile lors du passage d'accessoires tous plus de l'endroit de loin, de haut en bas de profondément imbriqués les enfants composants, avec presque pas d'autres composants ayant besoin de ces intermédiaires.
Attention: à la suite de la création de composants qui lient eux-mêmes à l'événement de bus sera tenu plus d'une fois-conduisant à plusieurs gestionnaires déclenchée et les fuites. J'ai personnellement jamais ressenti le besoin pour un événement de bus dans tous les single page applications que j'ai conçu dans le passé.
Le suivant montre comment une simple erreur conduit à une fuite où le
Item
composant déclenche toujours, même s'il est retiré de la DOM.JS:
HTML:
N'oubliez pas de retirer les auditeurs dans le
destroyed
cycle de vie du crochet.Banque centralisée (logique)
Vuex est le chemin à parcourir avec Vue pour la gestion de l'état. Il offre beaucoup plus que juste des événements et il est prêt pour l'application intégrale.
Et maintenant vous vous demandez:
Il brille vraiment quand:
Si vos composants peut vraiment se concentrer sur les choses qu'ils sont censés être, la gestion des interfaces utilisateur.
Cela ne signifie pas que vous ne pouvez pas l'utiliser pour le composant logique, mais je voudrais champ d'application de cette logique à un espace de noms Vuex module avec seulement le nécessaire mondial de l'INTERFACE utilisateur de l'état.
Pour éviter de traiter avec un gros gâchis de tout dans un état global, nous devons diviser le stocker dans de multiples espaces de modules.
Types de composants
Pour orchestre tous ces communications et à la facilité de réutilisation, nous devons penser de composants de deux types différents.
Encore une fois, cela ne veut pas dire qu'un composant générique doivent être réutilisés ou d'une application conteneur spécifique ne peut pas être réutilisée, mais ils ont des responsabilités différentes.
Application des conteneurs spécifiques
Ce sont juste simple Vue de composant qui encapsule autre Vue des composants (générique ou d'autres applications, des conteneurs spécifiques). C'est là que le Vuex magasin de la communication qui doit arriver et ce conteneur doit communiquer à l'aide d'autres simples comme des accessoires et des écouteurs d'événement.
Ces conteneurs peuvent même pas natif des éléments du DOM et de laisser les composants génériques face à cela.
C'est où la détermination de la portée qui se passe. La plupart des composants ne sais pas à propos de la boutique et ce composant de l' (pour la plupart) utiliser un espace de noms module boutique avec un ensemble limité de
getters
etactions
appliquée avec le Vuex mappeurs.Composants génériques
Ceux-ci devraient recevoir leurs données à partir d'accessoires, de faire des changements sur leurs propres données, et émettent de simples événements. La plupart du temps, ils ne devraient pas connaître une Vuex magasin existe.
Ils pourraient aussi être appelés conteneurs comme leur seule responsabilité pourrait être à l'expédition à d'autres composants de l'INTERFACE utilisateur.
Frère de communication
Alors, après tout cela, comment devrions-nous communiquer entre deux frère composants?
Il est plus facile de comprendre avec un exemple: disons que nous avons une zone de saisie et de ses données doivent être partagées à travers l'application (frères et sœurs, à différents endroits dans l'arbre) et a persisté avec un backend.
En commençant par le pire des cas, notre composant mélange de présentation et affaires logique.
De séparer ces deux préoccupations, nous devons appliquer notre composant dans une application conteneur spécifique, et de garder la logique de présentation dans notre générique composant d'entrée.
Notre composant d'entrée est maintenant réutilisables et ne sait pas sur le backend, ni les frères et sœurs.
Notre application conteneur spécifique, peut-être le pont entre la logique métier et la présentation de la communication.
Depuis le Vuex magasin actions traiter avec le backend de la communication, notre conteneur, ici, n'a pas besoin de savoir à propos de axios et le backend.
Bon, on peut communiquer entre frères et sœurs par le parent à l'aide de
v-on
événements.Supposons que nous voulons mettre à jour
Details
composant quand on clique sur un élément dansList
.dans
Parent
:Modèle:
Ici:
v-on:select-item
c'est un événement, qui sera appelé dansList
composant (voir ci-dessous);setSelectedItem
c'est unParent
's méthode de mise à jourselectedModel
;JS:
Dans
List
:Modèle:
JS:
Ici:
this.$emit('select-item', item)
enverra parselect-item
directement dans le parent. Et les parents de l'envoyer à laDetails
vueCe que j'ai l'habitude de le faire si je veux "hack" de la structure normale de la communication en Vue, spécialement maintenant que
.sync
est obsolète, est de créer une simple EventEmitter qui gère la communication entre les composants. De l'un de mes derniers projets:Avec cette
Transmitter
objet que vous pouvez ensuite le faire, en tout composant:Et de créer une "réception" de la composante:
Encore une fois, c'est vraiment des utilisations spécifiques. Ne pas la base de l'ensemble de votre demande sur ce modèle, utilisez quelque chose comme
Vuex
à la place.vuex
, mais encore une fois, dois-je créer vuex de stocker pour chaque mineur de communication?vuex
oui, allez-y! L'utiliser.