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

Snewedon
fonte

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

Vbranden
fonte
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.

tariqdaouda
fonte
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/[email protected]/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/[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
fonte
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.

Dominik Dosoudil
fonte
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
4

Vue 2.x

Para informações oficiais:

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

Um exemplo simples:

Em qualquer elemento, você deve adicionar um atributo refcom um valor único

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

Para direcionar esse elemento, use this.$refs.foo

this.$refs.foo.focus(); // it will focus the input having ref="foo"
Turna
fonte
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.

akauppi
fonte