Discover how to make your UI components talk to each other effortlessly!
Why Compound components pattern in Vue? - Purpose & Use Cases
Imagine building a complex UI like a tabs widget where you manually pass data and events between separate components without a clear connection.
You have to wire up each tab and panel yourself, making sure they stay in sync.
Manually managing communication between related components is confusing and error-prone.
You often end up with duplicated code, bugs where tabs don't update correctly, and hard-to-maintain logic scattered across components.
The compound components pattern lets you group related components together so they share state and logic automatically.
This means tabs and panels work seamlessly as one unit without extra wiring, making your code cleaner and easier to understand.
Parent passes props and emits events to sync Tab and Panel components manually.
<Tabs> <Tab>Tab 1</Tab> <Panel>Content 1</Panel> </Tabs>
This pattern enables building flexible, reusable UI components that work together naturally without complex prop drilling or event handling.
Think of a tabbed interface on a website where clicking a tab shows the right content panel instantly and all tabs know which one is active without extra code.
Manual syncing of related components is hard and buggy.
Compound components share state internally for smooth coordination.
This leads to cleaner, easier-to-maintain UI code.
Practice
Solution
Step 1: Understand the pattern goal
The compound components pattern groups related UI parts to work together inside one main component.Step 2: Compare options
Only To group related UI parts inside one main component for better organization correctly describes grouping related UI parts for better organization and communication.Final Answer:
To group related UI parts inside one main component for better organization -> Option AQuick Check:
Compound components group related parts = B [OK]
- Confusing unrelated components grouping
- Ignoring state sharing between parts
- Thinking it avoids provide/inject
Solution
Step 1: Identify state sharing methods
Vue offers several ways to share data, but for compound components, provide and inject are designed for parent-child communication without prop drilling.Step 2: Match pattern usage
Compound components use provide/inject to share state internally, unlike props or emit which are for direct parent-child or event communication.Final Answer:
provide and inject -> Option AQuick Check:
State sharing in compound components = provide/inject [OK]
- Choosing props which require manual passing
- Confusing emit with state sharing
- Thinking v-model is for internal state sharing
const TabGroup = {
setup() {
provide('activeTab', ref('home'))
},
template: ``
}
const Tab = {
inject: ['activeTab'],
props: ['name'],
template: `{{ name }}`
}
// Usage:
//
//
//
//
Solution
Step 1: Understand provide/inject in Options API
TabGroup provides 'activeTab' as ref('home'). Tab injects ['activeTab'], receiving the ref object (not auto-unwrapped in Options API).Step 2: Evaluate rendering logic
In template, activeTab (ref object) === name (string) is always false. No 'active' class applied to either button.Final Answer:
<button>home</button><button>profile</button> -> Option BQuick Check:
Options API inject ref === string = false [OK]
- Assuming inject returns raw value, not ref
- Confusing which tab is active
- Thinking activeTab is not reactive
const Dropdown = {
setup() {
const open = ref(false)
provide('open', open)
},
template: ``
}
const DropdownToggle = {
inject: ['open'],
template: `Toggle`
}
Solution
Step 1: Check inject handling in Options API
Injected refs via inject: ['open'] are not auto-unwrapped in Options API templates. 'open' is the ref object.Step 2: Understand mutation and reactivity issue
@click="open = !open" reassigns a boolean to the ref variable (breaks link to original ref) and lacks .value access, making the ref unusable reactively as boolean state.Final Answer:
The 'open' ref is not reactive inside DropdownToggle -> Option DQuick Check:
Options API injected ref needs .value [OK]
- Thinking provider setup needs to return state for provide
- Template syntax looks invalid
- Provide key seems missing
Solution
Step 1: Identify compound components pattern usage
The pattern uses provide/inject to share state like activeTab across nested components without prop drilling.Step 2: Evaluate options for state management
Use provide to share activeTab ref in Tabs, inject in TabList and TabPanels, update activeTab on Tab click correctly uses provide to share activeTab ref and inject in child components, updating activeTab on tab click to reflect changes.Final Answer:
Use provide to share activeTab ref in Tabs, inject in TabList and TabPanels, update activeTab on Tab click -> Option CQuick Check:
Compound components share state via provide/inject = D [OK]
- Using props and events causing complex prop drilling
- Using global event bus which is not recommended
- Keeping state local in each tab causing no sync
Ready to prove it?
Pass the test and this pattern moves unknown
