2017-12-20 3 views
0

So habe ich eine Struktur wie dieseVue Kind Daten von untergeordneten Komponente zu Komponente zu übergeben

<Root> 
<HomeNav> router-view 
<RouterLink> 
<RouterLink> 
<RouterLink> 
<RouterLink> 
<RouterLink> 
<Home> router-view 
<RouterLink> 

Nun wird jeder HomeNav Router-Links, indem die Daten in der Komponente Ändern von Daten zu root vorbei, aber das bedeutet, dass ich müssen diese Daten binden:

 <router-view v-bind:title="title" v-bind:text="text" v-bind:youtube="youtube" v-bind:transition="transition"></router-view> 

und die Funktionen laufen auf erstellt und aktualisiert:

new Vue({ 
    el: '#app', 
    router, 
    data: Variables, 
    created: function() { 
    path = pathname.pathname(); 
    pathLenght = pathname.countPathLenght(path); 
    this.homeText(this.data); 
    }, 
    updated: function() { 
    path = pathname.pathname(); 
    pathLenght = pathname.countPathLenght(path); 
    Pace.restart() 
    this.homeText(this.data); 
    }, 
    methods: { 
    homeText(data) { 
     data = toogleData.checkText(data); 
     this.title = data[0]; 
     this.text = data[1]; 
     this.youtube = data[2]; 
    } 
    } 
}) 

Das Problem ist jedoch, dass ich diese Daten nicht für alle Routen benötige, und ich muss diese Funktion ".homeText" nicht auslösen oder diese spezifischen Daten an jedes einzelne root binden. Es wird nur auf der Homepage benötigt, also die erste Route.

Die Frage ist also, ist es möglich, Daten von HomeNav-Komponente direkt zu Home-Komponente übergeben, ohne all diesen Code in globalen (Root) -Komponente?

Antwort

1

Dies ist ein großartiger Ort für die MessagePump, die die VueJs-Dokumentation vorschlägt. Es ist im Wesentlichen ein ungebundenes Vue-Objekt, das als Vermittler zwischen Objekten fungiert. Auf diese Weise können Sie Ereignisse auf der Pumpe definieren und aufrufen, die an die entsprechende Komponente weitergeleitet werden.

window.MessagePump = new Vue({}); 

Vue.Component(
    'HomeNav', 
    { 
     ... 
     data: function() { 
      return { 
       homeText: 'something' 
      } 
     }, 
     ... 
     mounted: function() { 
      var thisArg = this 
      MessagePump.$on(
       'homeTextChanged', 
       function(newText) { 
        thisArg.homeText = newText; 
       } 
      ); 
     } 
     ... 
    } 
); 

Vue.Component(
    'Home', 
    { 
     ... 
     mounted: function() { 
      MessagePump.$emit('homeTextChanged', 'To This'); 
     } 
     ... 
    } 
); 

Dies wird das Ereignis und die Änderung von HomeText von 'etwas' zu 'To This' auslösen.

+0

sieht gut @Justin MacArthur, wie es geht, wenn 2 Variablen ändern müssen, d. H. Titel und Text? – Przemek

+0

Von dem, was ich erinnere mich an jeden Parameter nach dem Namen des Ereignisses ist die Funktion zugeordnet. so wird '$ on (name, arg1, arg2, ..., argN)' mit '$ emit (name, 'arg1', 'arg2', ..., argN)' –

+0

aufgerufen. Kann MessagePump auch einen anderen Namen haben wenn ich es auch für etwas anderes benutzen möchte? Ie MessagePump2? – Przemek

Verwandte Themen