Hone logo
Hone
Problems

Asynchronous Computed Properties in Vue with TypeScript

This challenge focuses on implementing asynchronous computed properties in a Vue.js application using TypeScript. Asynchronous computed properties are essential when your computed value relies on fetching data from an API or performing other time-consuming operations, ensuring your UI remains responsive while the data is being retrieved.

Problem Description

You are tasked with creating a Vue component that displays a user's profile information fetched from a mock API. The component should have a computed property that asynchronously retrieves the user data based on a userId prop. The computed property should handle loading states and potential errors gracefully, displaying appropriate messages to the user. The component should also include a button to increment the userId prop, triggering a re-fetch of the user data.

Key Requirements:

  • Asynchronous Data Fetching: The computed property must use async/await to fetch data from a mock API.
  • Loading State: The component should display a loading indicator while the data is being fetched.
  • Error Handling: The component should display an error message if the data fetching fails.
  • TypeScript: The code must be written in TypeScript, adhering to type safety.
  • Reactivity: The computed property should automatically re-evaluate when the userId prop changes.
  • Clear UI: The component should present the user data in a readable format.

Expected Behavior:

  1. Initially, the component should display a loading indicator.
  2. Once the data is fetched successfully, the user's profile information (name and email) should be displayed.
  3. If the data fetching fails, an error message should be displayed.
  4. Clicking the "Next User" button should increment the userId prop, triggering a new data fetch and updating the UI accordingly.
  5. The loading indicator should reappear during each data fetch.

Edge Cases to Consider:

  • What happens if the API returns a 404 (Not Found) error?
  • What happens if the API is unavailable or takes a very long time to respond?
  • How can you prevent race conditions if multiple data fetches are triggered in quick succession? (While not strictly required for this challenge, consider it for a more robust solution).

Examples

Example 1:

Input: userId = 1
Output: Displays loading indicator initially, then displays user data for userId 1 (e.g., Name: John Doe, Email: john.doe@example.com)
Explanation: The component fetches user data for userId 1 from the mock API and renders the retrieved information.

Example 2:

Input: userId = 999 (API returns 404)
Output: Displays loading indicator initially, then displays an error message (e.g., "User not found").
Explanation: The component attempts to fetch user data for userId 999, but the API returns a 404 error. The component handles the error and displays an appropriate message.

Example 3:

Input: userId = 2, then click "Next User" button multiple times quickly.
Output: Displays loading indicator for each fetch.  The UI updates with the data for the latest userId.
Explanation: The button click increments the userId, triggering a new fetch.  The component handles the rapid updates by displaying the loading indicator during each fetch.

Constraints

  • API Endpoint: Use the following mock API endpoint: https://jsonplaceholder.typicode.com/users/{userId}. (Note: This API is rate-limited. Excessive requests may result in temporary blocking.)
  • Data Structure: The API returns a JSON object with properties like name and email.
  • Timeout: Assume a maximum API response time of 2 seconds. If the API takes longer than 2 seconds, consider displaying an error message indicating a timeout. (Not strictly required, but good practice).
  • Error Handling: Handle network errors and invalid responses from the API.

Notes

  • Consider using a ref to manage the loading state and error message.
  • The watch API is not required for this challenge, but could be used to implement more complex logic.
  • Focus on creating a clean, readable, and well-typed solution.
  • Remember to handle potential errors during the asynchronous operation.
  • The mock API is for demonstration purposes only. In a real-world application, you would use a more robust API client.
Loading editor...
typescript