📖 Scenario: You are building a Vue 3 app where you want to reuse some logic to add a border style to different components. Instead of repeating the border code, you will create a higher-order component (HOC) that wraps any component and adds a border around it.
🎯 Goal: Build a higher-order component in Vue 3 that takes a component and returns a new component with a red border around it. Then use this HOC to wrap a simple message component and display it with the border.
📋 What You'll Learn
Create a simple message component that displays a text
Create a higher-order component function that accepts a component and returns a new component
The returned component should render the original component inside a div with a red border
Use the higher-order component to wrap the message component and display it
💡 Why This Matters
🌍 Real World
Higher-order components help reuse common logic or styling in Vue apps without repeating code. This pattern is useful for theming, layout wrappers, or adding behavior to many components.
💼 Career
Understanding higher-order components is valuable for Vue developers to write clean, reusable, and maintainable code in professional projects.
Progress0 / 4 steps
1
Create the simple message component
Create a Vue 3 component called Message using <script setup> that renders a <p> element with the text "Hello from Message component!".
Vue
Hint
Use <script setup> and a simple <p> tag inside the template to show the message.
2
Create the higher-order component function
Add a function called withRedBorder that accepts a component called WrappedComponent and returns a new Vue component. This new component should render WrappedComponent inside a <div> with a style attribute setting border: '2px solid red'.
Vue
Hint
Use Vue's h function to create the wrapper div with a red border style and render the passed component inside.
3
Wrap the Message component with the higher-order component
Import the Message component and create a new component called BorderedMessage by passing Message to the withRedBorder function. Register BorderedMessage so it can be used in the template.
Vue
Hint
Use import Message from './Message.vue' and then create BorderedMessage by calling withRedBorder(Message).
4
Render the wrapped component in the template
Replace the existing <p> in the template with the <BorderedMessage /> component to display the message inside the red border.
Vue
Hint
Use the component tag <BorderedMessage /> inside the template to show the wrapped message.
Practice
(1/5)
1. What is the main purpose of a higher-order component (HOC) in Vue?
easy
A. To create a new Vue instance from scratch
B. To replace the Vue router with a new navigation system
C. To wrap a component and add shared logic or styling
D. To directly manipulate the DOM elements inside a component
Solution
Step 1: Understand what HOCs do
Higher-order components wrap existing components to add extra features without changing the original component.
Step 2: Identify the correct purpose
Among the options, only wrapping a component to add shared logic or styling matches the HOC concept.
Final Answer:
To wrap a component and add shared logic or styling -> Option C
Quick Check:
HOC purpose = wrap and add logic [OK]
Hint: HOCs wrap components to add features without changing them [OK]
Common Mistakes:
Confusing HOCs with routing or Vue instance creation
Thinking HOCs manipulate DOM directly
Believing HOCs replace components instead of wrapping
2. Which of the following is the correct syntax to create a higher-order component in Vue 3 using the Composition API?
A HOC is a function that returns a new component wrapping the original. Using setup and render function with h() is correct.
Step 2: Check each option
const withLogger = (WrappedComponent) => { return { setup() { return () => h(WrappedComponent) } } } returns a component object with setup returning a render function that renders WrappedComponent, which is correct.
A. The HOC does not pass props to WrappedComponent
B. The HOC should use a class component instead
C. The Base component must be a function, not an object
D. The setup function cannot return a render function
Solution
Step 1: Check prop forwarding in HOC
The HOC returns WrappedComponent but does not forward any props it receives.
Step 2: Understand consequence
When using <Enhanced title="Welcome" />, the title prop is lost because it's not passed down.
Final Answer:
The HOC does not pass props to WrappedComponent -> Option A
Quick Check:
Props must be forwarded in HOCs [OK]
Hint: Always forward props from HOC to wrapped component [OK]
Common Mistakes:
Forgetting to pass props in render function
Thinking setup can't return render function
Believing Base must be a function component
5. You want to create a higher-order component withLoading that shows a loading message while data is loading, then renders the wrapped component with the loaded data. Which approach correctly combines HOC logic with Vue 3 Composition API?
hard
A. Create a mixin that adds loading state and use it inside the wrapped component
B. Modify the wrapped component's template directly to add loading message
C. Use a global variable to track loading and conditionally render wrapped component
D. Return a component with setup() that uses ref for loading state, fetches data, and renders loading or wrapped component with props
Solution
Step 1: Understand HOC with loading logic
The HOC should manage loading state internally and decide what to render based on it.
Step 2: Identify correct Vue 3 pattern
Using setup with ref for loading, fetching data, and returning a render function that shows loading or wrapped component with data is correct.
Final Answer:
Return a component with setup() that uses ref for loading state, fetches data, and renders loading or wrapped component with props -> Option D
Quick Check:
HOC manages state and renders conditionally [OK]
Hint: Use setup with state and conditional render in HOC [OK]
Common Mistakes:
Changing wrapped component template directly
Using global variables for state
Confusing mixins with HOCs
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.