VueJs ottiene un elemento all'interno di un componente


117

Ho un componente, come posso selezionare uno dei suoi elementi?

Sto cercando di ottenere un input che si trova all'interno del modello di questo componente.

Potrebbero esserci più componenti, quindi il queryselector deve analizzare solo l'istanza corrente del componente.

Vue.component('somecomponent', {
    template: '#somecomponent',
    props: [...],

   ...

    created: function() {
        somevariablehere.querySelector('input').focus();
    }
});

Grazie in anticipo

Risposte:


113

puoi accedere ai figli di un componente vuejs con this.$children. se si desidera utilizzare il selettore di query sull'istanza del componente corrente, allorathis.$el.querySelector(...)

solo facendo un semplice console.log(this) ti mostrerà tutte le proprietà di un'istanza del componente vue.

inoltre se conosci l'elemento a cui vuoi accedere nel tuo componente, puoi aggiungervi la v-el:uniquenamedirettiva e accedervi tramitethis.$els.uniquename


6
Suggerimento: this.$elnon è definito finché non viene montato. Se vuoi inizializzare una variabile, fallo inmount()
wedi

167

vuejs 2

v-el:el:uniquenameè stato sostituito da ref="uniqueName". Si accede quindi all'elemento tramite this.$refs.uniqueName.


1
Questo mi ha aiutato a capire che l' refattributo funziona su qualsiasi elemento HTML o componente Vue. Roba buona.
C. Bess

3
Sembra questo. $ Refs.uniqueName è un array, quindi è necessario questo. $ Refs.uniqueName [0] per ottenere l'elemento di riferimento.
Nicolas S.Xu

solo dopo il componente di montaggio, che potrebbe essere fatto nel metodo montato del genitore: medium.com/@brockreece/…
Yordan Georgiev

47

Le risposte non sono chiare:

Usa this.$refs.someName, ma, per usarlo, devi aggiungere ref="someName"il genitore .

Guarda la demo di seguito.

new Vue({
  el: '#app',
  mounted: function() {
    var childSpanClassAttr = this.$refs.someName.getAttribute('class');
    
    console.log('<span> was declared with "class" attr -->', childSpanClassAttr);
  }
})
<script src="https://unpkg.com/vue@2.5.13/dist/vue.min.js"></script>

<div id="app">
  Parent.
  <span ref="someName" class="abc jkl xyz">Child Span</span>
</div>

$refs e v-for

Si noti che quando viene utilizzato insieme a v-for, this.$refs.someName sarà un array:

new Vue({
  el: '#app',
  data: {
    ages: [11, 22, 33]
  },
  mounted: function() {
    console.log("<span> one's text....:", this.$refs.mySpan[0].innerText);
    console.log("<span> two's text....:", this.$refs.mySpan[1].innerText);
    console.log("<span> three's text..:", this.$refs.mySpan[2].innerText);
  }
})
span { display: inline-block; border: 1px solid red; }
<script src="https://unpkg.com/vue@2.5.13/dist/vue.min.js"></script>

<div id="app">
  Parent.
  <div v-for="age in ages">
    <span ref="mySpan">Age is {{ age }}</span>
  </div>
</div>


1
È anche importante notare che gli articoli reffed NON sono reattivi.
Pithikos

38

In Vue2 tieni presente che puoi accedere a $ refs.uniqueName solo dopo aver montato il componente.


2
Tutto ciò che è stato montato prima nel ciclo di vita di Vue non viene presentato nel tuo browser. Poiché non è stato ancora montato, non è disponibile alcuna ispezione DOM.
Coreus


1

API di composizione

La sezione dei modelli di riferimento spiega come questo è stato unificato:

  • all'interno del modello, usa ref="myEl"; :ref=con unv-for
  • all'interno dello script, avere un const myEl = ref(null)ed esporlo dasetup

Il riferimento trasporta l'elemento DOM dal montaggio in poi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.