Hone logo
Hone
Problems

Mastering Vue Template Refs with TypeScript

Vue's template refs provide a powerful way to directly access DOM elements or child component instances within your templates. This is crucial for tasks like managing focus, integrating with third-party libraries, or performing imperative DOM manipulations. This challenge will guide you through implementing and utilizing template refs effectively in a Vue 3 application using TypeScript.

Problem Description

Your task is to build a Vue 3 component that demonstrates the use of template refs to interact with specific DOM elements. You will need to:

  1. Define a template ref: Declare a ref variable in your script setup that will be bound to an HTML element in the template.
  2. Access the DOM element: In a lifecycle hook (like onMounted), access the DOM element associated with the ref.
  3. Perform an action: Use the accessed DOM element to perform a practical action, such as setting focus to an input field.
  4. Type safety: Ensure that the template ref is correctly typed using TypeScript for robust development.

The component should have an input field and a button. When the button is clicked, the input field should gain focus.

Examples

Example 1:

Input: (Conceptual - refers to the component's state and user interaction) A Vue component with a template:

<template>
  <div>
    <input ref="myInput" type="text" />
    <button @click="focusInput">Focus Input</button>
  </div>
</template>

And script setup:

import { ref, onMounted, Ref } from 'vue';

export default {
  setup() {
    const myInput: Ref<HTMLInputElement | null> = ref(null);

    const focusInput = () => {
      if (myInput.value) {
        myInput.value.focus();
      }
    };

    // Optional: auto-focus on mount for demonstration
    onMounted(() => {
      focusInput();
    });

    return {
      myInput,
      focusInput,
    };
  },
};

Output: When the component mounts, the input field is automatically focused. When the "Focus Input" button is clicked, the input field also receives focus.

Explanation: The myInput ref is declared and typed as Ref<HTMLInputElement | null>. It's bound to the <input> element using ref="myInput". In onMounted, myInput.value (which is the actual HTMLInputElement instance) is used to call .focus(). The focusInput method also performs this action when the button is clicked.

Example 2:

Input: (Conceptual - showing the value of myInput.value at different stages)

  • Before mount: myInput.value is null.
  • After mount: myInput.value is an instance of HTMLInputElement.
  • After button click: myInput.value remains the same HTMLInputElement instance.

Output: The DOM reflects the focus state change on the input element.

Explanation: This example highlights the state of the ref's value property throughout the component's lifecycle, demonstrating how Vue populates the ref after the DOM has been rendered.

Constraints

  • Vue.js version: 3.x
  • Language: TypeScript
  • Must use <script setup> syntax.
  • The template ref must be typed for the specific DOM element it's bound to (e.g., HTMLInputElement, HTMLButtonElement).
  • Avoid direct DOM manipulation outside of using the template ref.

Notes

  • Remember that template refs are only available after the component has been mounted. Accessing them in created or beforeMount will result in null.
  • When typing your ref, consider the possibility of it being null initially and after unmounting.
  • This challenge focuses on DOM elements. Vue 3 also supports template refs for child component instances, which is a related but distinct concept.
Loading editor...
typescript