Коли стають доступними ref-елементи?
ref-елементи стають доступними лише після того, як компонент був змонтований, тобто в хуку mounted (або пізніше).
Простіше кажучи:
this.$refsв Options API іref()в Composition API доступні лише після рендеру DOM - у хукуmounted.
Чому не раніше?
До етапу mounted компонента немає в DOM, тому:
- елементи ще не створені
this.$refsпорожній- посилання
ref()не прив'язані
Доступність ref у різних API
Options API
У created()
js
created() {
console.log(this.$refs.input) // undefined
}У mounted()
js
mounted() {
console.log(this.$refs.input) // <input ...>
}Composition API
За допомогою ref():
html
<input ref="inputEl" />У setup():
js
const inputEl = ref(null)
onMounted(() => {
console.log(inputEl.value) // DOM element
})До mounted:
js
console.log(inputEl.value) // nullЧому ref з'являється лише в mounted?
Тому що Vue спочатку:
- Виконує
setup()/ lifecycle-хуки створення - Створює віртуальний DOM
- Монтує його в реальний DOM
- Лише тепер ref прив'язуються до DOM-елементів
- Викликає
mounted
І лише тепер усі ref коректні.
Приклад
vue
<template>
<input ref="field" />
</template>
<script>
export default {
mounted() {
// Тепер DOM-елемент доступний
this.$refs.field.focus()
}
}
</script>Особливість: ref на компоненті
Коли ти робиш:
html
<MyComponent ref="comp" />this.$refs.comp - це екземпляр дочірнього компонента.
І він теж доступний лише в mounted.
Винятки?
- Teleport може затримувати появу DOM-елемента -> ref буде доступний не одразу в mounted.
- v-if може створювати компонент пізніше -> ref оновиться пізніше, при активації.
Але правило одне:
ref завжди доступний після того, як DOM-вузол фізично існує.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.