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

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


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.


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/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 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/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
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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.