Hone logo
Hone
Problems

Vue.js Dependency Injection with Provide/Inject

Dependency injection is a powerful pattern for managing dependencies between components, promoting reusability and testability. Vue 3's provide and inject APIs offer a straightforward way to implement dependency injection across component hierarchies without needing to pass props down through every level. This challenge will guide you in creating a simple dependency injection system using provide and inject in a Vue 3 TypeScript project.

Problem Description

You are tasked with creating a reusable service that provides a configuration object. This configuration object will contain a theme property (string, e.g., "light" or "dark") and an apiUrl property (string, e.g., "https://api.example.com"). You need to implement a system where components deep within the component tree can access this configuration without having to pass it down through intermediate components that don't need it. Use Vue's provide and inject to achieve this.

Key Requirements:

  • Create a ConfigurationService that holds the configuration object.
  • Create a parent component (App.vue) that uses provide to make the ConfigurationService available.
  • Create a child component (ChildComponent.vue) that uses inject to access the configuration.
  • The ChildComponent should display the current theme and API URL.
  • The ConfigurationService should be able to be updated, and the changes should be reflected in the ChildComponent.

Expected Behavior:

  • When the App component provides the ConfigurationService, the ChildComponent should be able to access the configuration object.
  • Changes to the configuration object within the ConfigurationService should automatically update the display in the ChildComponent.
  • The code should be well-structured, readable, and follow TypeScript best practices.

Edge Cases to Consider:

  • What happens if a component tries to inject a key that hasn't been provided? (Vue will throw a warning).
  • How can you ensure type safety when injecting the configuration?

Examples

Example 1:

Input: App.vue provides a ConfigurationService with theme: "light", apiUrl: "https://api.example.com"
Output: ChildComponent displays "Theme: light" and "API URL: https://api.example.com"
Explanation: The ChildComponent successfully injects the ConfigurationService and displays its properties.

Example 2:

Input: App.vue updates the ConfigurationService to theme: "dark", apiUrl: "https://newapi.example.com"
Output: ChildComponent displays "Theme: dark" and "API URL: https://newapi.example.com"
Explanation: The ChildComponent automatically updates its display to reflect the changes in the ConfigurationService.

Constraints

  • The solution must be written in TypeScript.
  • The solution must use Vue 3's provide and inject APIs.
  • The solution must be modular and well-structured.
  • The solution should be able to handle updates to the configuration object.
  • The apiUrl must be a string.
  • The theme must be a string.

Notes

  • Consider using a reactive object for the configuration to ensure that changes are automatically reflected in injected components.
  • Think about how to handle potential errors if the configuration is not provided. While Vue will warn, you might want to add more robust error handling.
  • Focus on creating a clean and maintainable solution that demonstrates the core principles of dependency injection with provide and inject.
  • You can use Vue's <script setup> syntax for a more concise component definition.
Loading editor...
typescript