Hone logo
Hone
Problems

Integrating JSX with Vue 3 using TypeScript

This challenge focuses on leveraging the power of JSX within a Vue 3 component written in TypeScript. JSX allows for a more concise and expressive way to define UI structures, particularly when dealing with complex or dynamic components. Successfully completing this challenge demonstrates an understanding of how to combine Vue's reactivity and component system with JSX's syntax.

Problem Description

You are tasked with creating a Vue 3 component that utilizes JSX to render a dynamic list of items. The component should accept a items prop, which is an array of objects. Each object in the array will have a name property (string) and an age property (number). The JSX should render a list of div elements, where each div displays the name and age of an item from the items array. The component should also include a heading "User List" above the list. The component must be written in TypeScript and properly typed.

Key Requirements:

  • TypeScript: The component must be written in TypeScript with appropriate type definitions for props and component state (if any).
  • JSX: Use JSX to define the component's template.
  • Dynamic List: The component must dynamically render the list based on the items prop.
  • Prop Type Validation: The items prop should be validated to ensure it's an array of objects with the expected name and age properties.
  • Clear Rendering: Each list item should clearly display the name and age of the corresponding object.
  • Heading: A heading "User List" should be rendered above the list.

Expected Behavior:

When the component receives an array of user objects as the items prop, it should render a list of div elements, each displaying the name and age of a user. If the items prop is empty, the component should render an empty list (no errors). If the items prop is not an array or contains objects without name and age properties, the component should handle the error gracefully (e.g., by rendering a message indicating invalid data, or by simply rendering nothing).

Edge Cases to Consider:

  • Empty items array.
  • items prop is null or undefined.
  • items prop is not an array.
  • Objects within the items array are missing the name or age properties.
  • name is not a string or age is not a number.

Examples

Example 1:

Input: items = [{ name: "Alice", age: 30 }, { name: "Bob", age: 25 }]
Output:
<div>User List</div>
<div>Name: Alice, Age: 30</div>
<div>Name: Bob, Age: 25</div>
Explanation: The component renders a heading and a list of two divs, each displaying the name and age of a user.

Example 2:

Input: items = []
Output:
<div>User List</div>
Explanation: The component renders a heading and an empty list.

Example 3:

Input: items = [{ name: "Charlie" }, { age: 40 }]
Output:
<div>User List</div>
Explanation: The component renders a heading.  The list items are not rendered because the objects are missing required properties.  (Error handling is expected, but the exact output for error handling is flexible).

Constraints

  • The component must be a functional component using the <script setup> syntax.
  • The items prop must be an array of objects. Each object must have a name property (string) and an age property (number).
  • The component should be performant; avoid unnecessary re-renders.
  • The code must be valid TypeScript and Vue 3 code.

Notes

  • Consider using the defineProps macro to define the items prop and its type.
  • You can use the map function to iterate over the items array and generate the JSX elements.
  • Error handling is important, but the specific error message or behavior is flexible. Focus on preventing the component from crashing and providing a reasonable user experience.
  • Remember to import the necessary modules from Vue and TypeScript.
  • The goal is to demonstrate the ability to use JSX within a Vue 3 component with TypeScript.
Loading editor...
typescript