VueJs obtenant un élément dans un composant


117

J'ai un composant, comment puis-je sélectionner l'un de ses éléments?

J'essaye d'obtenir une entrée qui est dans le modèle de ce composant.

Il peut y avoir plusieurs composants, de sorte que le sélecteur de requêtes ne doit analyser que l'instance actuelle du composant.

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

   ...

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

Merci d'avance

Réponses:


113

vous pouvez accéder aux enfants d'un composant vuejs avec this.$children. si vous souhaitez utiliser le sélecteur de requête sur l'instance de composant actuelle, alorsthis.$el.querySelector(...)

faire un simple console.log(this)vous montrera toutes les propriétés d'une instance de composant vue.

de plus si vous connaissez l'élément auquel vous souhaitez accéder dans votre composant, vous pouvez y ajouter la v-el:uniquenamedirective et y accéder viathis.$els.uniquename


6
Astuce: this.$eln'est pas défini tant qu'il n'est pas monté. Si vous voulez initialiser une variable, faites-le dansmount()
wedi

167

vuejs 2

v-el:el:uniquenamea été remplacé par ref="uniqueName". L'élément est ensuite accessible via this.$refs.uniqueName.


1
Cela m'a aidé à réaliser que l' refattribut fonctionne sur n'importe quel élément HTML ou composant Vue. Bon produit.
C. Bess

3
Cela ressemble à ceci. $ Refs.uniqueName est un tableau, vous avez donc besoin de ceci. $ Refs.uniqueName [0] pour obtenir l'élément référencé.
Nicolas S.Xu

seulement après le composant de montage, ce qui pourrait être fait dans la méthode montée du parent: medium.com/@brockreece
Yordan Georgiev

47

Les réponses ne sont pas claires:

Utilisez this.$refs.someName, mais, pour l'utiliser, vous devez ajouter ref="someName"le parent .

Voir la démo ci-dessous.

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 et v-for

Notez que lorsqu'il est utilisé en conjonction avec v-for, le this.$refs.someName sera un tableau:

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
Il est également important de noter que les éléments refusés ne sont PAS réactifs.
Pithikos

38

Dans Vue2, sachez que vous pouvez accéder à ceci. $ Refs.uniqueName uniquement après avoir monté le composant.


2
Tout ce qui était avant monté dans le cycle de vie de Vue n'est pas présenté dans votre navigateur. Comme il n'a pas encore été monté, aucune inspection DOM n'est disponible.
Coreus


1

API de composition

La section des références de modèles indique comment cela a été unifié:

  • dans le modèle, utilisez ref="myEl"; :ref=avec unv-for
  • dans le script, ayez un const myEl = ref(null)et exposez-le à partir desetup

La référence porte l'élément DOM à partir du montage.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.