What if you could add powerful behaviors to elements with just a simple tag?
Creating custom directives in Vue - Why You Should Know This
Imagine you want to add the same special behavior, like focusing an input or changing colors on hover, to many elements in your app by writing plain JavaScript for each one.
Manually adding event listeners and DOM changes everywhere is repetitive, easy to forget, and makes your code messy and hard to maintain.
Custom directives let you package that behavior once and reuse it simply by adding a special attribute to any element, keeping your code clean and consistent.
const input = document.querySelector('#myInput'); input.addEventListener('focus', () => { input.style.backgroundColor = 'yellow'; });
app.directive('highlight', { mounted(el) { el.addEventListener('focus', () => { el.style.backgroundColor = 'yellow'; }); } }); // In template: <input v-highlight>
You can create reusable, easy-to-apply behaviors that keep your templates simple and your JavaScript organized.
Adding a custom directive to automatically focus form fields when a modal opens, without repeating code for every input.
Manual DOM handling is repetitive and error-prone.
Custom directives package behavior for easy reuse.
They keep your code clean and your app consistent.
Practice
Solution
Step 1: Understand what directives do in Vue
Directives are special markers on elements that tell Vue to do something with that element.Step 2: Identify the role of custom directives
Custom directives let you add reusable behavior to elements, like focusing an input or changing styles dynamically.Final Answer:
To add reusable behavior to HTML elements -> Option AQuick Check:
Custom directives = reusable element behavior [OK]
- Confusing directives with components
- Thinking directives manage app state
- Assuming directives handle routing
v-focus in Vue 3?Solution
Step 1: Recall Vue 3 global directive registration
In Vue 3, you use the app instance's directive method with the directive name without the 'v-' prefix.Step 2: Check the lifecycle hook and syntax
The correct hook for when the element is inserted is 'mounted', and the function receives the element as argument.Final Answer:
app.directive('focus', { mounted(el) { el.focus() } }) -> Option BQuick Check:
Vue 3 global directive = app.directive('name', { mounted }) [OK]
- Including 'v-' prefix in directive name
- Using Vue.directive instead of app.directive in Vue 3
- Using deprecated hooks like 'bind'
app.directive('color', {
mounted(el, binding) {
el.style.color = binding.value
},
updated(el, binding) {
el.style.color = binding.value
}
})
What will be the text color of the paragraph after the component updates if used as <p v-color="'red'">Hello</p> and later the binding value changes to 'blue'?Solution
Step 1: Understand directive lifecycle hooks
The 'mounted' hook sets the color initially, and the 'updated' hook runs when the binding value changes.Step 2: Trace the color change on update
When the binding value changes to 'blue', the 'updated' hook sets the element's color style to 'blue'.Final Answer:
The text color will change to blue -> Option CQuick Check:
updated hook changes color to new binding value [OK]
- Assuming color stays as initial value
- Ignoring the updated lifecycle hook
- Thinking directive causes errors on update
app.directive('tooltip', {
mounted(el, binding) {
el.setAttribute('title', binding.value)
},
updated(el, binding) {
el.setAttribute('title', binding.oldValue)
}
})
What is the problem with this directive when the binding value changes?Solution
Step 1: Analyze the updated hook usage
The updated hook sets the title attribute to binding.oldValue, which is the previous value, not the new one.Step 2: Understand the effect on the tooltip
Because it sets the old value on update, the tooltip does not reflect the new binding value after change.Final Answer:
The tooltip title does not update to the new value -> Option AQuick Check:
updated hook must use binding.value, not binding.oldValue [OK]
- Using binding.oldValue instead of binding.value on update
- Assuming no update needed for title
- Confusing syntax error with logic error
v-auto-focus that automatically focuses an input element only when it is inserted into the DOM and not on updates. Which is the best way to implement this directive in Vue 3?Solution
Step 1: Identify when to focus the element
The input should be focused only once when inserted, so the 'mounted' hook is the right place.Step 2: Avoid focusing on updates
Calling focus in 'updated' would focus repeatedly, which is not desired.Step 3: Understand Vue 3 lifecycle hooks
There is no 'created' hook for directives; 'mounted' is the earliest for DOM access.Final Answer:
Use the mounted hook to call el.focus() and leave updated empty -> Option DQuick Check:
Focus on mounted only, not updated [OK]
- Focusing in updated hook causing repeated focus
- Using non-existent created hook for directives
- Calling focus multiple times unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
