Discover how a simple Vue feature can save you hours of frustrating DOM hunting!
Why Template refs for DOM access in Vue? - Purpose & Use Cases
Imagine you want to change the color of a button or focus an input box when a user clicks another element, but you have to find that element in the page manually every time.
Manually searching and changing DOM elements is slow, messy, and can break easily if the page structure changes. It's like trying to find a book in a messy room every time you want to read it.
Template refs let you mark elements in your Vue template and access them directly in your code. This makes it easy and safe to interact with the DOM without hunting for elements.
const button = document.querySelector('#myButton'); button.style.color = 'red';
import { ref } from 'vue'; const button = ref(null); // in template: <button ref="button">Click</button> button.value.style.color = 'red';
It enables direct, reliable access to DOM elements inside Vue components, making UI interactions smooth and maintainable.
When a form loads, you want the first input box to be focused automatically so the user can start typing right away without clicking.
Manual DOM access is fragile and hard to maintain.
Template refs provide a clean way to access elements directly.
This improves code clarity and user experience in Vue apps.
Practice
template refs in Vue?Solution
Step 1: Understand what template refs do
Template refs provide a way to directly access DOM elements or child components inside Vue templates.Step 2: Compare with other Vue features
Reactive state variables and computed properties are for data management, not direct DOM access. Global components registration is unrelated.Final Answer:
To directly access DOM elements or child components from the template -> Option AQuick Check:
Template refs = direct DOM/component access [OK]
- Confusing refs with reactive state
- Thinking refs create computed properties
- Assuming refs register components
<script setup> syntax?Solution
Step 1: Recall how to declare refs in Vue 3 script setup
Useconst myRef = ref(null);to create a ref variable initialized to null.Step 2: Check other options for correctness
reactiveis for objects, not refs.computedis for derived values. Usingvaris discouraged and 'element' is not a valid initial value for a ref to DOM.Final Answer:
const myRef = ref(null); -> Option AQuick Check:
Declare ref with ref(null) [OK]
- Using reactive instead of ref for DOM refs
- Initializing ref with wrong value
- Using var instead of const
<template>
<input ref="inputRef" />
<button @click="focusInput">Focus</button>
</template>
<script setup>
import { ref } from 'vue';
const inputRef = ref(null);
function focusInput() {
console.log(inputRef.value.tagName);
inputRef.value.focus();
}
</script>Solution
Step 1: Understand what inputRef.value refers to
inputRef is a ref to the input DOM element, so inputRef.value is the actual input element.Step 2: Check what tagName returns and focus behavior
inputRef.value.tagName returns the uppercase tag name "INPUT". Calling focus() sets keyboard focus on the input.Final Answer:
"INPUT" will be logged and the input will get focus -> Option CQuick Check:
inputRef.value.tagName = "INPUT" and focus works [OK]
- Logging the ref variable name instead of its value
- Forgetting to use .value to access the element
- Assuming tagName is lowercase
<template>
<div ref="box">Content</div>
</template>
<script setup>
import { ref } from 'vue';
const box = ref();
console.log(box.value.textContent);
</script>Solution
Step 1: Check ref initialization and usage timing
box is declared as ref() without initial value, which defaults to undefined. Accessing box.value.textContent immediately runs before DOM is ready.Step 2: Understand Vue lifecycle for DOM refs
Template refs are assigned after the component mounts. Accessing them too early (during setup) causes box.value to be null or undefined, so textContent access fails.Final Answer:
Accessing box.value.textContent before DOM is mounted causes error -> Option BQuick Check:
Access DOM refs only after mount [OK]
- Trying to read ref value before DOM exists
- Not initializing ref with null (less critical)
- Confusing ref attribute syntax
Solution
Step 1: Use onMounted to run code after DOM is ready
To safely access the input element, focus must be called inside onMounted lifecycle hook.Step 2: Access the DOM element via inputRef.value and call focus()
inputRef is a ref initialized to null, and inputRef.value holds the DOM element after mount. Calling inputRef.value.focus() sets focus correctly.Final Answer:
Code snippet C correctly uses onMounted and inputRef.value.focus() -> Option DQuick Check:
Use onMounted + inputRef.value.focus() [OK]
- Calling focus outside onMounted before DOM ready
- Using :ref instead of ref attribute
- Calling focus on ref instead of ref.value
Ready to prove it?
Pass the test and this pattern moves unknown
