2017-01-13 1 views
4

Ich habe eine Lösung von LinusBorg here gefunden, die einen Bus global in jeder Vue-Instanz registriert. Gibt es eine Möglichkeit, dies in einer Komponentenhierarchie zu definieren, so dass ich mehrere übergeordnete Busse erstellen kann? Grundsätzlich, wenn ich mehrere "root" -level-Komponenten mit einigen Kindern hatte, sollte ein Ereignis-Bus für die "root" -level-Komponente eingerichtet werden, und es ist Kinder, und nicht alle Vue-Instanzen.vuejs2 - wie man Ereignisbusse für einzelne Dateikomponentenhierarchien erstellt

Ich kann die einfachen $emit und $on nicht verwenden, da die Hierarchie nicht auf einfache parent-child Kommunikation beschränkt ist. Also müssen Ereignisse über mehrere Ebenen hinweg durchlaufen werden.

+0

Wenn Sie nur zurück zu einem Elternteil emittieren möchten, können Sie direkt emittieren: 'this. $ Parent. $ Emit', oder' this. $ emit' verwenden und auf das Ereignis direkt auf der Komponente warten. –

+0

Die Hierarchie hat mehrere Komponenten, und nicht nur direkte Kind -> Eltern Kommunikation ist erforderlich. Ich werde die Frage aktualisieren. – Johannes

Antwort

5

Sie können eine js-Datei wie eventBus.js erstellen und exportieren nur vue Beispiel:

import Vue from 'vue' 
const bus = new Vue() 
export default bus 

dann können Sie das Ereignis Bus in Ihrem .vue Datei importieren

import bus from 'path/to/eventBus' 

... 

bus.$on('foo', ...) 

-Update meine antwort aus der diskussion in den kommentaren:

da ein ereignisname nur ein str ist Sie können dem Ereignis einen Präfix/Namespace hinzufügen, z. B. bus.$emit('domain.foo') oder bus.$emit('domain/foo').

Wenn Sie der Meinung sind, dass Ihre Anwendung immer komplexer wird, wählen Sie einfach vuex.

+0

Wie würde ich das in einer untergeordneten Komponente verwenden? Das Importieren des Busses würde eine neue Instanz erstellen. Wie könnte ich den Bus an die Komponentenhierarchie binden? – Johannes

+0

@Johannes Nein, die Instanz wird nur einmal erstellt. Alle Ihre importierten "Bus" ist die gleiche Instanz – CodinCat

+0

Sorry, ich verstehe das nicht ganz. Wenn "eventBus.js" die Instanz nur einmal erstellt, was ist der Unterschied zwischen der Verwendung der LinusBorg-Lösung, bei der ich eine Instanz an den 'Vue'-Prototyp binde? Was ich vorhabe, ist es, Busse mit unterschiedlichem Umfang zu erstellen (sagen wir, wir haben einen begrenzten Bus für eine Gitterkomponente, einen anderen für die Chat-Komponente usw.) – Johannes

Verwandte Themen