2016-03-12 16 views
14

Sto usando vue-loader (http://vuejs.github.io/vue-loader/start/spec.html) per costruire i miei *.vue componenti singolo file, ma sto avendo difficoltà con il processo da estrarre un componente singolo file da un altro.Come estendere un altro componente VueJS in un componente a singolo file? (ES6 vue-loader)

Se un componente segue le specifiche per export default { [component "Foo" definition] }, io penso che sia solo una questione di importazione di questa componente (come farebbe con qualsiasi componente figlio) e poi export default Foo.extend({ [extended component definition] })

Purtroppo questo non funziona. Qualcuno può offrire consigli?

risposta

9

Il modo corretto per farlo sarebbe quello di utilizzare mixins: http://vuejs.org/guide/mixins.html

Pensate mixin come componenti astratti, che puoi estendere. In questo modo è possibile creare un mixin con qualsiasi funzionalità che si desidera avere in entrambi e quindi applicarlo a ciascuno dei componenti.

21

Dopo alcuni test, la soluzione più semplice è stato quello di essere sicuri di esportare un oggetto Vue.extend() piuttosto che un oggetto sotto gli occhi di tutte le componenti da estendere.

Nel mio caso, il componente di base:

import Vue from 'vue' 

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

e la componente estesa:

import Foo from './Foo' 

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

Questa è una grande idea, contento che capito capito. Posso immaginare che in alcuni punti sarebbe preferibile mixin – Jeff

+0

Esattamente quello che stavo cercando, grazie. Questa è una risposta migliore rispetto alla soluzione IMO accettata, perché non è possibile creare un intero componente in quanto aumenterebbe notevolmente la possibilità di una collisione del nome. Mixin dovrebbe essere limitato a un codice condiviso più piccolo. – Kashif

+1

Questo ha funzionato per me, ma ho dovuto fare attenzione alle funzioni di override. Ad esempio, le chiamate al ciclo di vita come quelle montate non sono state ignorate, stranamente entrambe le chiamate sono state chiamate: it e its super. Ma le funzioni dichiarate nei metodi sono state sovrascritte. Così ho spostato la logica che doveva essere sovrascritta nei metodi e li chiamava dalla chiamata del ciclo di vita. – yeahdixon

11

Un'altra possibilità è l'opzione extends:

import Foo from './Foo' 

export default { extends: Foo } 
+0

È comunque possibile estendere più oggetti come default di esportazione {extends: Foo, Bar, Baz} – Phantom007

+0

@ Mixins Phantom007. – trusktr

Problemi correlati