VueJs obtendo um elemento dentro de um componente


117

Eu tenho um componente, como posso selecionar um de seus elementos?

Estou tentando obter uma entrada que está dentro do modelo deste componente.

Pode haver vários componentes, portanto, o queryselector deve apenas analisar a instância atual do componente.

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

   ...

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

desde já, obrigado

Respostas:


112

você pode acessar os filhos de um componente vuejs com this.$children. se você quiser usar o seletor de consulta na instância do componente atual, entãothis.$el.querySelector(...)

apenas fazer um simples console.log(this)mostrará a você todas as propriedades de uma instância do componente vue.

além disso, se você conhece o elemento que deseja acessar em seu componente, pode adicionar a v-el:uniquenamediretiva a ele e acessá-lo por meio dethis.$els.uniquename


6
Dica: this.$elé indefinido até ser montado. Se você quiser inicializar uma variável, faça-o na mount()
quarta

166

vuejs 2

v-el:el:uniquenamefoi substituído por ref="uniqueName". O elemento é acessado por meio de this.$refs.uniqueName.


1
Isso me ajudou a perceber que o refatributo funciona em qualquer elemento HTML ou componente Vue. Coisa boa.
C. Bess

3
Ele se parece com isso. $ Refs.uniqueName é um array, então você precisa disso. $ Refs.uniqueName [0] para obter o elemento referenciado.
Nicolas S.Xu

somente após o componente de montagem, o que pode ser feito no método montado dos pais: medium.com/@brockreece/…
Yordan Georgiev

46

As respostas não estão deixando isso claro:

Use this.$refs.someName, mas, para usá-lo, você deve adicionar ref="someName"o pai .

Veja a demonstração abaixo.

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

Observe que, quando usado em conjunto com v-for, o this.$refs.someName será uma 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
Também é importante observar que os itens refeitos NÃO são reativos.
Pithikos

38

No Vue2, esteja ciente de que você pode acessar este. $ Refs.uniqueName somente após montar o componente.


2
Tudo antes montado no ciclo de vida do Vue não é apresentado em seu navegador. Como ainda não foi montado, não há inspeção DOM disponível.
Coreus


1

API de composição

A seção de referências do modelo informa como isso foi unificado:

  • dentro do modelo, use ref="myEl"; :ref=com umv-for
  • dentro do script, tenha um const myEl = ref(null)e exponha-o desetup

A referência carrega o elemento DOM da montagem em diante.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.