142 votes

Vue.js obtient un élément dans un composant

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

J'essaie d'obtenir une entrée qui se trouve dans le modèle de ce composant.

Il peut y avoir plusieurs composants, de sorte que le querySelector ne doit analyser que l'instance actuelle du composant.

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

   ...

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

182voto

tariqdaouda Points 1391

Vuejs 2

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

1 votes

Cela m'a aidé à réaliser que le ref fonctionne sur tout élément HTML ou composant Vue. Une bonne chose.

4 votes

Il semble que this.$refs.uniqueName soit un tableau, donc vous devez utiliser this.$refs.uniqueName[0] pour obtenir l'élément référencé.

0 votes

Seulement après le composant de montage, qui pourrait être fait dans la méthode de montage du parent : medium.com/@brockreece/

140voto

vbranden Points 2710

Il y a plusieurs options en fonction de ce à quoi vous essayez d'accéder :

  • Vous pouvez accéder aux composants enfants d'un composant Vue.js avec this.$children

  • Vous pouvez étiqueter des éléments DOM spécifiques dans votre modèle à l'aide des éléments suivants ref="uniqueName" et s'y référer plus tard via this.$refs.uniqueName
    (mais n'oubliez pas que vous ne pourrez pas vous y référer tant que le composant/application n'aura pas été mis à jour). montage terminé et effectué un rendu initial)

  • Si vous n'êtes pas en mesure d'étiqueter vos éléments, vous pouvez interroger le DOM pour trouver les éléments enfants à l'aide d'un sélecteur CSS via this.$el.querySelector('.myClass > .childElement')
    (comme ci-dessus, le composant/app doit avoir montage terminé )

Vous pouvez également explorer en faisant une simple console.log(this) dans votre composant et il vous montrera toutes les propriétés de votre instance de composant Vue.

8 votes

Un conseil : this.$el est indéfini jusqu'à ce qu'il soit monté. Si vous voulez initialiser une variable, faites-le dans mount()

56voto

acdcjunior Points 19898

Les réponses ne sont pas claires :

Utilisez this.$refs.someName mais, pour l'utiliser, vous devez ajouter ref="someName" dans 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 votes

Il est également important de noter que les articles reffed ne sont PAS réactifs.

41voto

Dominik Dosoudil Points 515

Sur Vue2 sachez que vous pouvez accéder this.$refs.uniqueName seulement après avoir monté le composant.

2 votes

Tout ce qui précède le montage dans le cycle de vie de Vue n'est pas présenté dans votre navigateur. Puisqu'il n'a pas encore été monté, il n'y a pas d'inspection DOM disponible.

5voto

Zawad Points 611

Vue 2.x

Pour des informations officielles :

https://vuejs.org/v2/guide/migration.html#v-el-and-v-ref-replaced

Un exemple simple :

Sur tout élément, vous devez ajouter un attribut ref avec un valeur unique

<input ref="foo" type="text" >

Pour cibler cet élément, utilisez this.$refs.foo

this.$refs.foo.focus(); // it will focus the input having ref="foo"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X