2016-04-21 28 views
7

Vue.js'de geçersiz kılma yöntemini kullanmak mümkün mü?Vue.js devralma çağrısı üst yöntemi

var SomeClassA = Vue.extend({ 
    methods: { 
     someFunction: function() { 
      // ClassA some stuff 
     } 
    } 
}); 

var SomeClassB = SomeClassA.extend({ 
    methods: { 
     someFunction: function() { 
      // CALL SomeClassA.someFunction 
     } 
    } 
}); 

ClassB someFunction tarafından ClassA someFunction ürününü çağırmak istiyorum. Bu mümkün mü?

cevap

13

Hayır, vue doğrudan bir miras modeli ile çalışmaz. Bildiğim kadarıyla bir bileşeni yapamazsınız. Ebeveyn-çocuk ilişkileri esas olarak sahne ve olaylar aracılığıyla çalışır.

1. Geçme sahne (ebeveyn-çocuk)

var SomeComponentA = Vue.extend({ 
    methods: { 
     someFunction: function() { 
      // ClassA some stuff 
     } 
    } 
}); 

var SomeComponentB = Vue.extend({ 
    props: [ 'someFunctionParent' ], 
    methods: { 
     someFunction: function() { 
      // Do your stuff 
      this.someFunctionParent(); 
     } 
    } 
}); 

ve SomeComponentA ait şablonda:

<some-component-b someFunctionParent="someFunction"></some-component-b> 

2. Katmalar

ancak üç çözüm vardır

bu başka yerlerde kullanmak istediğiniz ortak işlevselliği bir mixin kullanarak daha fazla deyimsel olabilir ise:

var mixin = { 
    methods: { 
     someFunction: function() { 
      // ... 
     } 
    } 
}; 

var SomeComponentA = Vue.extend({ 
    mixins: [ mixin ], 
    methods: { 
    } 
}); 

var SomeComponentB = Vue.extend({ 
    methods: { 
     someFunctionExtended: function() { 
      // Do your stuff 
      this.someFunction(); 
     } 
    } 
}); 
(çirkin ebeveyn-çocuk,) ana sahne

// In someComponentB's 'someFunction': 
this.$parent.$options.methods.someFunction(...); 
çağrılması

3.

+0

1. Son çare söz konusu olduğunda oldukça iyi bir çözümdür, ancak çok genişletilemez. 2. Burada Mixins kullanmayı düşündüm, ancak işlev adlarını değiştirmenin gerekliliği de genişletilemez. 3. Bu çalışmayı bile başarabilir misiniz? http://jsfiddle.net/9s146cdr/1/. Bu en iyi bahis olurdu, eğer sadece doğruysa :) – MyFantasy512

+0

Gerçekten # 3 kullanmanızı önermiyorum ve sadece referans olarak dahil ettik. Diğer ikisi ise çok daha fazla deyimseldir (miras, genelde çok fazla anlam ifade etmemektedir, çünkü componentA, soyut bir sınıf değil, DOM'da B bileşeninden farklı sorumluluklara sahip bir ana bileşen değildir). Genişletilebilirlik hakkında daha az düşünürseniz ve bileşen sorumlulukları hakkında daha fazla düşünürseniz yardımcı olabilir. – nils

+0

# 3 kullanamazsınız çünkü çalışmaz :) _Since ile kabul edemiyorum A bileşeni soyut bir sınıf değil, DOM'daki bir bileşenin componentB_'den farklı sorumlulukları olan bir ana bileşenidir çünkü öznitelikle adlandırılmış sınıfları kullanmam gerekir, 'SomeAbstractComponentA' olmalıdır . Ember'den Vue'ye geliyorum ve bence, bileşenlerde miras, yanlış bir şey değil. – MyFantasy512