2016-03-03 7 views
9

çocuklara göre belirli bir çocuğa erişmeye çalışıyorum. Çünkü çocuk nerede yapıldığı anda ben bu tarafından çocuğu arayacağım: o çocuk her zaman [0] ideal tarafından olurdu harika olarakVue.js Bileşen adına göre

this.$root.$children[0] 

sürece tamam gidecekseniz yolu ise

this.$root.$children['detail'] 

i $ ref sorunuma anwser olabilir ama bana yardımcı olan bir yol bulmak asla düşünmeye devam: böyle bir şey yapmak.

herhangi bir fikir?

cevap

14

Bu çocuk, gerçekten erişmek istediğiniz bileşenin bir çocuğundan bahsediyor musunuz?

// in the code of the parent component, access the referenced child component like this: 
 

 
this.$refs.detailsChild
<!-- Template of the parent component, assuming your child Component is called Details --> 
 
<details v-ref:details-child></details>

ilgili API Belgeleri: Örneğin

this.$root.$children[0].$options.name 

: Bu özellik kullanabilirsiniz http://vuejs.org/api/#v-ref

+0

, bunun yerine böyle şablonda 'ref' niteliğini ayarlarsınız:' '. https://vuejs.org/v2/api/#ref – thanksd

0
this.$root.$children[0].constructor.name 
+5

Lütfen daha fazla bilgi ile düzenleyin. Sadece kod ve "bunu dene" yanıtları önerilmez, çünkü bunlar aranabilir içerik içermez ve neden birinin "bunu denemesi" gerektiğini açıklamamaktadır. – abarisone

6

Bu durumda, v-ref gerçekten cevaptır :

this.$root.$children.find(child => { return child.$options.name === "name"; }); 
+0

Bu sadece OP $ 'nin sorduğu '$ children' dizisindeki ilk bileşenin ismine erişir. – thanksd

+0

Çocukları ada göre filtrelemek için bu kodu kullanabilirsiniz. – drinor

+0

Ne kadar? Bir satır kodunuz dizideki ilk öğenin adına erişiyor. OP'nin problemini çözmek için bu kod satırının nasıl kullanılabileceği konusunda herhangi bir açıklama yapmadınız. – thanksd

0

Mutlaka derinden iç içe bileşenleri varsa aslında bazen mümkün değildir, $refs gerekmez. Arama yaparken birkaç kez bu Q & A buldum, ama sonunda bu duruma sık sık rastladığımdan beri kendi çözümümüzü uygulamaya karar verdim. Döngü için eski okuldan ayrılmayın, birkaç nedenden ötürü gereklidir, bir için, x<descendants.length için test ediyorum (len=descendants.length gibi bir şey ayarlamaya ve buna karşı test yapmak yerine). Döngü için ikinci yığında iterek.

Birincisi, kullanımı:

let unPersonalizable = matchingDescendants(this, /a.checkimprintfiinformation$/, {first: true}); 

Uygulama: Bu kullanarak Vue v2 gelen insanlar için

function matchingDescendants(vm, matcher, options) { 
    let descendants = vm.$children; 
    let descendant; 
    let returnFirst = (options || {}).first; 
    let matches = []; 

    for (let x=0; x<descendants.length; x++) { 
     descendant = descendants[x]; 

     if (matcher.test(descendant.$vnode.tag)) { 
      if (returnFirst) { 
       return descendant; 
      } 
      else { 
       matches.push(descendant); 
      } 
     } 

     for (let y=0, len = descendant.$children.length; y<len; y++) { 
      descendants.push(descendant.$children[y]); 
     }  
    } 

    return matches.length === 0 ? false : matches; 
}