useTemplateRef در vue 3.5

useTemplateRef در vue 3.5

توی vue اگر میخواستیم یک ref برای یک کامپوننت تعریف کنیم، باید یک متغیر از نوع ref تعریف میکردیم و به کامپوننت مون اسم اون متغیر رو به عنوان پراپرتی ref بهش پاس میدادیم، مثلا:

<script setup>import { ref, onMounted } from 'vue'const list = ref([  /* ... */])const itemRefs = ref([])onMounted(() => console.log(itemRefs.value))</script><template>  <ul>    <li v-for="item in list" ref="itemRefs">      {{ item }}    </li>  </ul></template>

از نسخه ی 3.5 یک پراپرتی جدید به نام useTemplateRef در اختیارمون قرار گرفته که میتونیم برای این کار ازش استفاده کنیم:

<script setup>import { useTemplateRef, onMounted } from 'vue'// the first argument must match the ref value in the templateconst input = useTemplateRef('my-input')onMounted(() => {  input.value.focus()})</script><template>  <input ref="my-input" /></template>

توی هر دوی این روش باید حواستون به این نکته باشه که ما بعد از این که کامپوننت مون mount شد میتونیم به رفرنس child ها مون دسترسی داشته باشیم و قبل از اون مقدار null خواهند داشت، پس یا باید عملیات مون رو داخل onMounted انجام بدیم و یا اگر از watch استفاده می کنیم باید قبلش چک کنیم که null نباشه.

برای این که حالت آرایه هم داشته باشه میتونیم این اینجوری پیاده سازی کنیم:

<script setup>import { ref, useTemplateRef, onMounted } from 'vue'const list = ref([  /* ... */])const itemRefs = useTemplateRef('items')onMounted(() => console.log(itemRefs.value))</script><template>  <ul>    <li v-for="item in list" ref="items">      {{ item }}    </li>  </ul></template>

منبع:


تگ ها: