VueJs pobierają element wewnątrz komponentu

117

Mam komponent, jak mogę wybrać jeden z jego elementów?

Próbuję uzyskać dane wejściowe, które znajdują się w szablonie tego składnika.

Składników może być wiele, więc selektor zapytań musi przeanalizować tylko bieżące wystąpienie składnika.

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

   ...

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

Z góry dziękuję

Snewedon
źródło

Odpowiedzi:

113

możesz uzyskać dostęp do elementów podrzędnych komponentu vuejs za pomocą this.$children. jeśli chcesz wtedy użyć selektora zapytania w bieżącej instancji składnikathis.$el.querySelector(...)

proste zrobienie console.log(this)tego pokaże Ci wszystkie właściwości instancji komponentu vue.

dodatkowo, jeśli znasz element, do którego chcesz uzyskać dostęp w swoim komponencie, możesz dodać do niego v-el:uniquenamedyrektywę i uzyskać do niego dostęp za pośrednictwemthis.$els.uniquename

vbranden
źródło
6
Wskazówka: this.$eljest niezdefiniowana, dopóki nie zostanie zamontowana. Jeśli chcesz zainicjalizować zmienną, zrób to zamount()
śr.
167

vuejs 2

v-el:el:uniquenamezostał zastąpiony przez ref="uniqueName". Następnie uzyskuje się dostęp do elementu przez this.$refs.uniqueName.

tariqdaouda
źródło
1
Pomogło mi to zrozumieć, że refatrybut działa na dowolnym elemencie HTML lub komponencie Vue. Dobry towar.
C. Bess
3
Wygląda to tak. $ Refs.uniqueName jest tablicą, więc potrzebujesz tego. $ Refs.uniqueName [0], aby pobrać element, do którego się odwołuje.
Nicolas S.Xu
tylko po zamontowaniu elementu, co można było zrobić metodą montażu rodzica: medium.com/@brockreece/…
Yordan Georgiev
47

Odpowiedzi nie wyjaśniają tego jasno:

Użyj this.$refs.someName, ale aby z niego skorzystać, musisz dodać ref="someName"rodzica .

Zobacz demo poniżej.

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 i v-for

Zauważ, że użyte w połączeniu z v-for, this.$refs.someName będzie tablicą:

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
źródło
1
Należy również pamiętać, że odrzucone przedmioty NIE są reaktywne.
Pithikos
38

W Vue2 pamiętaj, że możesz uzyskać dostęp do tego. $ Refs.uniqueName dopiero po zamontowaniu komponentu.

Dominik Dosoudil
źródło
2
Wszystko przed zamontowaniem w cyklu życia Vue nie jest wyświetlane w Twojej przeglądarce. Ponieważ nie został jeszcze zamontowany, nie ma dostępnej inspekcji DOM.
Coreus
4

Vue 2.x

W celu uzyskania oficjalnych informacji:

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

Prosty przykład:

Do każdego elementu musisz dodać atrybut refo unikalnej wartości

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

Aby kierować na użycie tego elementu this.$refs.foo

this.$refs.foo.focus(); // it will focus the input having ref="foo"
Turna
źródło
1

Kompozycja API

Sekcja Odniesienia do szablonów mówi, jak to zostało ujednolicone:

  • w szablonie, użyj ref="myEl"; :ref=zv-for
  • w skrypcie, miej const myEl = ref(null)i ujawnij go zsetup

Odniesienie przenosi element DOM od momentu montażu.

akauppi
źródło