2016-03-12 3 views
14

Ich benutze vue-loader (http://vuejs.github.io/vue-loader/start/spec.html), um meine *.vue Single-File-Komponenten zu erstellen, aber ich habe Probleme mit dem Prozess von einer Komponente aus einer einzigen Datei von einem anderen zu erweitern.Wie erweitere ich eine andere VueJS-Komponente in einer einzelnen Dateikomponente? (ES6 vue-loader)

Wenn eine Komponente die Spezifikation zu export default { [component "Foo" definition] } folgt, würde ich denke, es ist nur eine Frage, diese Komponente zu importieren (wie ich bei jeder anderen Kind-Komponente) und dann export default Foo.extend({ [extended component definition] })

Leider funktioniert das nicht. Kann mir jemand bitte einen Rat geben?

Antwort

9

Der richtige Weg, dies zu tun, wäre Mixins zu verwenden: http://vuejs.org/guide/mixins.html

Denken Sie an Mixins als abstrakte Komponenten, die Sie erweitern können. Sie können also ein Mixin mit allen Funktionen erstellen, die Sie in beiden haben möchten, und es dann einfach auf jede Ihrer Komponenten anwenden.

21

Nach einigen Tests bestand die einfache Lösung darin, ein Vue.extend() Objekt anstelle eines einfachen Objekts für jede Komponente zu exportieren, die erweitert wurde.

In meinem Fall die Basiskomponente:

import Vue from 'vue' 

export default Vue.extend({ [component "Foo" definition] }) 

und die erweiterte Komponente:

import Foo from './Foo' 

export default Foo.extend({ [extended component definition] }) 
+0

Dies ist eine coole Idee, froh, dass du es herausgefunden habe. Ich kann mir vorstellen, dass dies an einigen Orten besser wäre als Mixins – Jeff

+0

Genau das, was ich gesucht habe, danke. Dies ist eine bessere Antwort als die angenommene Lösung IMO, da eine ganze Komponente nicht gemischt werden kann, da dies die Wahrscheinlichkeit einer Namenskollision stark erhöhen würde. Mixin sollte auf einen kleineren gemeinsamen Code beschränkt sein. – Kashif

+1

Das funktionierte für mich, aber ich musste aufpassen, Funktionen zu überschreiben. Zum Beispiel Lifecycle-Anrufe wie mounted wurden nicht überschrieben, seltsamerweise wurden beide aufgerufen: es und seine super. Aber Funktionen, die in Methoden deklariert wurden, wurden überschrieben. Also bewegte ich Logik, die in Methoden überschrieben werden musste und rief sie aus dem Lifecycle-Aufruf. – yeahdixon

11

Eine weitere Möglichkeit ist die extends Option:

import Foo from './Foo' 

export default { extends: Foo } 
+0

Gibt es trotzdem können wir mehrere Objekte wie Export Standard erweitern {erweitert: Foo, Bar, Baz} – Phantom007

+0

@ Phantom007 Mixins. – trusktr

Verwandte Themen