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ę

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


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.


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


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.