VueJs obteniendo un elemento dentro de un componente

117

Tengo un componente, ¿cómo puedo seleccionar uno de sus elementos?

Estoy tratando de obtener una entrada que esté dentro de la plantilla de este componente.

Puede haber varios componentes, por lo que el selector de consultas solo debe analizar la instancia actual del componente.

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

   ...

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

Gracias por adelantado

Snewedon
fuente

Respuestas:

110

puede acceder a los elementos secundarios de un componente de vuejs con this.$children. si desea utilizar el selector de consultas en la instancia del componente actual, entoncesthis.$el.querySelector(...)

simplemente hacer un simple console.log(this)le mostrará todas las propiedades de una instancia de componente vue.

Además, si conoce el elemento al que desea acceder en su componente, puede agregarle la v-el:uniquenamedirectiva y acceder a él a través dethis.$els.uniquename

vbranden
fuente
6
Sugerencia: this.$elno está definido hasta que se monta. Si desea inicializar una variable, hágalo enmount()
wedi
165

vuejs 2

v-el:el:uniquenameha sido reemplazado por ref="uniqueName". A continuación, se accede al elemento a través de this.$refs.uniqueName.

tariqdaouda
fuente
1
Esto me ayudó a darme cuenta de que el refatributo funciona en cualquier elemento HTML o componente Vue. Buen material.
C. Bess
3
Se ve así. $ Refs.uniqueName es una matriz, por lo que necesita esto. $ Refs.uniqueName [0] para obtener el elemento referenciado.
Nicolas S.Xu
solo después del componente de montaje, que se podría hacer en el método de montaje del padre: medium.com/@brockreece/…
Yordan Georgiev
45

Las respuestas no lo dejan claro:

Use this.$refs.someName, pero, para usarlo, debe agregar ref="someName"el parent .

Vea la demostración a continuación.

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/[email protected]/dist/vue.min.js"></script>

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

$refs y v-for

Tenga en cuenta que cuando se usa junto con v-for, this.$refs.someName será una matriz:

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/[email protected]/dist/vue.min.js"></script>

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

acdcjunior
fuente
1
También es importante tener en cuenta que los artículos refinados NO son reactivos.
Pithikos
38

En Vue2, tenga en cuenta que puede acceder a este. $ Refs.uniqueName solo después de montar el componente.

Dominik Dosoudil
fuente
2
Todo lo que antes estaba montado en el ciclo de vida de Vue no se presenta en su navegador. Dado que aún no se ha montado, no hay inspección DOM disponible.
Coreus
1

API de composición

La sección de referencias de la plantilla indica cómo se ha unificado esto:

  • dentro de la plantilla, use ref="myEl"; :ref=con unv-for
  • dentro de la secuencia de comandos, tener un const myEl = ref(null)y exponerlo desdesetup

La referencia lleva el elemento DOM desde el montaje en adelante.

akauppi
fuente