VueJs รับองค์ประกอบภายในคอมโพเนนต์


117

ฉันมีองค์ประกอบฉันจะเลือกองค์ประกอบใดองค์ประกอบหนึ่งได้อย่างไร

ฉันกำลังพยายามรับอินพุตที่อยู่ในเทมเพลตของคอมโพเนนต์นี้

อาจมีหลายองค์ประกอบดังนั้นตัวเลือกแบบสอบถามต้องแยกวิเคราะห์อินสแตนซ์ปัจจุบันของคอมโพเนนต์เท่านั้น

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

   ...

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

ขอบคุณล่วงหน้า

คำตอบ:


114

คุณสามารถเข้าถึงเด็กขององค์ประกอบ vuejs this.$childrenกับ หากคุณต้องการใช้ตัวเลือกคิวรีในอินสแตนซ์คอมโพเนนต์ปัจจุบันthis.$el.querySelector(...)

เพียงแค่ทำง่ายๆconsole.log(this)จะแสดงคุณสมบัติทั้งหมดของอินสแตนซ์ส่วนประกอบ vue

นอกจากนี้หากคุณทราบองค์ประกอบที่คุณต้องการเข้าถึงในองค์ประกอบของคุณคุณสามารถเพิ่มv-el:uniquenameคำสั่งลงไปและเข้าถึงได้ผ่านทางthis.$els.uniquename


6
คำแนะนำ: this.$elไม่ได้กำหนดไว้จนกว่าจะติดตั้ง หากคุณต้องการที่จะเริ่มต้นตัวแปรทำมันในmount()
WEDI

167

vuejs 2

v-el:el:uniquenameref="uniqueName"ได้ถูกแทนที่ด้วย this.$refs.uniqueNameองค์ประกอบที่มีการเข้าถึงแล้วผ่าน


1
สิ่งนี้ช่วยให้ฉันรู้ว่าrefแอตทริบิวต์ทำงานกับองค์ประกอบ HTML หรือส่วนประกอบ Vue สิ่งที่ดี.
ค. เบส

3
ดูเหมือนว่า $ refs.uniqueName คืออาร์เรย์ดังนั้นคุณต้องใช้สิ่งนี้ $ refs.uniqueName [0] เพื่อรับองค์ประกอบที่อ้างอิง
Nicolas S.Xu

หลังจากติดตั้งส่วนประกอบซึ่งสามารถทำได้ในวิธีการติดตั้งของผู้ปกครอง: medium.com/@brockreece/…
Yordan Georgiev

48

คำตอบยังไม่ชัดเจน:

ใช้this.$refs.someNameแต่ในการใช้งานคุณต้องเพิ่มref="someName"ในพาเรนต์

ดูการสาธิตด้านล่าง

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 และ v-for

ขอให้สังเกตว่าเมื่อใช้ร่วมกับv-forที่this.$refs.someName จะเป็นอาร์เรย์:

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
สิ่งสำคัญที่ควรทราบคือรายการที่ตอบกลับจะไม่ทำปฏิกิริยา
Pithikos

38

ในVue2 โปรดทราบว่าคุณสามารถเข้าถึงได้ $ refs.uniqueNameหลังจากติดตั้งส่วนประกอบแล้วเท่านั้น


2
ทุกอย่างก่อนที่จะติดตั้งในวงจรชีวิตของ Vue จะไม่ปรากฏในเบราว์เซอร์ของคุณ เนื่องจากยังไม่ได้ติดตั้งจึงไม่มีการตรวจสอบ DOM
Coreus

4

Vue 2.x

สำหรับข้อมูลอย่างเป็นทางการ:

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

ตัวอย่างง่ายๆ:

ในองค์ประกอบใด ๆ คุณต้องเพิ่มแอตทริบิวต์ที่refมีค่าเฉพาะ

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

เพื่อกำหนดเป้าหมายการใช้งานแบบอิเล็กทรอนิกส์นั้น this.$refs.foo

this.$refs.foo.focus(); // it will focus the input having ref="foo"

1

Composition API

ส่วนการอ้างอิงเทมเพลตจะบอกว่าสิ่งนี้รวมเข้าด้วยกันอย่างไร:

  • ภายในเทมเพลตใช้ref="myEl"; :ref=กับv-for
  • ภายในสคริปต์มีconst myEl = ref(null)และเปิดเผยจากsetup

การอ้างอิงดำเนินการองค์ประกอบ DOM ตั้งแต่การติดตั้งเป็นต้นไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.