Hone logo
Hone
Problems

Dynamic Error Message Display in Vue.js with TypeScript

This challenge focuses on implementing robust and dynamic error message display within a Vue.js application using TypeScript. You'll be building a component that validates user input and presents clear, user-friendly error messages based on the validation results. This is a crucial skill for building user-friendly and reliable web applications.

Problem Description

You are tasked with creating a ValidationInput component in Vue.js that handles input validation and displays appropriate error messages. The component should accept a validationRules prop, which is an array of objects. Each object in the validationRules array defines a specific validation rule and its corresponding error message. The component should also accept a modelValue prop, which represents the value of the input field.

The component should:

  1. Validate the input: Based on the validationRules prop, validate the modelValue prop.
  2. Display error messages: If the input fails any of the validation rules, display the corresponding error message(s) below the input field.
  3. Clear error messages: If the input passes all validation rules, clear any previously displayed error messages.
  4. Emit an event: Emit a update:modelValue event whenever the modelValue changes.

Key Requirements:

  • The validationRules prop should be an array of objects, where each object has the following structure:
    {
        rule: (value: string) => boolean; // Validation function
        message: string; // Error message to display
    }
    
  • The modelValue prop should be a string.
  • The component should use TypeScript for type safety.
  • The component should be reusable and easily configurable with different validation rules.

Expected Behavior:

  • When the component is initialized, it should validate the initial modelValue and display any relevant error messages.
  • As the user types into the input field, the component should continuously validate the input and update the error messages accordingly.
  • When the input is valid, all error messages should be cleared.
  • The update:modelValue event should be emitted with the new value whenever the input changes.

Edge Cases to Consider:

  • Empty validationRules array: The component should not display any error messages and should not perform any validation.
  • Invalid validationRules format: The component should handle cases where the validationRules array contains objects with an incorrect format gracefully (e.g., by ignoring invalid rules).
  • Null or undefined modelValue: The component should handle null or undefined modelValue appropriately.

Examples

Example 1:

Input:
validationRules: [
    { rule: (value) => value.length > 0, message: "This field is required." },
    { rule: (value) => value.length <= 10, message: "This field must be 10 characters or less." }
]
modelValue: ""
Output:
Displays "This field is required." below the input field.

Explanation: The input is empty, so the "This field is required." error message is displayed.

Example 2:

Input:
validationRules: [
    { rule: (value) => value.length > 0, message: "This field is required." },
    { rule: (value) => value.length <= 10, message: "This field must be 10 characters or less." }
]
modelValue: "Hello"
Output:
No error messages are displayed.

Explanation: The input "Hello" is valid according to both validation rules.

Example 3:

Input:
validationRules: [
    { rule: (value) => value.length > 0, message: "This field is required." },
    { rule: (value) => value.length <= 10, message: "This field must be 10 characters or less." }
]
modelValue: "ThisIsAVeryLongString"
Output:
Displays "This field must be 10 characters or less." below the input field.

Explanation: The input "ThisIsAVeryLongString" is longer than 10 characters, so the corresponding error message is displayed.

Constraints

  • The component should be implemented using Vue 3 and TypeScript.
  • The component should be relatively simple and easy to understand. Avoid complex state management solutions.
  • The validation rules should be defined as functions that return a boolean value.
  • The component should be responsive and update the error messages in real-time as the user types.
  • The component should not rely on external libraries for validation.

Notes

  • Consider using Vue's reactivity system to automatically update the error messages when the modelValue changes.
  • Think about how to handle multiple error messages for a single input field.
  • Focus on creating a clean and maintainable component that is easy to configure and reuse.
  • The update:modelValue event is crucial for two-way data binding in Vue. Make sure it's emitted correctly.
  • You can use a simple <div> element to display the error messages. Styling is not a primary focus of this challenge.
Loading editor...
typescript