Component registration lets Vue know about your components so you can use them in your app. Global registration makes components available everywhere, while local registration limits them to specific parts.
Component registration (global vs local) in Vue
/* Global registration */ import MyButton from './MyButton.vue' app.component('MyButton', MyButton) /* Local registration inside a component */ export default { components: { MyButton } }
Global registration is done on the Vue app instance before mounting.
Local registration is done inside the components option of a component.
<MyButton> usable anywhere in the app without importing it again.// Global registration example import { createApp } from 'vue' import App from './App.vue' import MyButton from './MyButton.vue' const app = createApp(App) app.component('MyButton', MyButton) app.mount('#app')
<MyButton> usable only inside this component.// Local registration example import MyButton from './MyButton.vue' export default { components: { MyButton }, template: `<MyButton />` }
This example shows a button component registered locally inside a parent component. Clicking the button updates the count shown inside it.
<script setup> import { ref } from 'vue' import MyButton from './MyButton.vue' const count = ref(0) function increment() { count.value++ } </script> <template> <h2>Local Registration Example</h2> <MyButton @click="increment">Clicked {{ count }} times</MyButton> </template> <!-- MyButton.vue --> <script setup> const emit = defineEmits(['click']) </script> <template> <button @click="$emit('click')" style="padding: 0.5rem 1rem; font-size: 1rem;"> <slot></slot> </button> </template>
Global registration can increase app size if many components are registered but not used everywhere.
Local registration helps keep components scoped and can improve performance by loading only needed components.
Use PascalCase or kebab-case for component names consistently.
Global registration makes components available everywhere in the app.
Local registration limits component usage to a specific component only.
Choose registration type based on how widely you use the component and app size considerations.
Practice
Solution
Step 1: Understand global registration
Global registration means the component can be used in any template without importing it again.Step 2: Understand local registration
Local registration means the component is only available inside the component where it is registered.Final Answer:
Global registration makes a component available everywhere, local limits it to one component. -> Option CQuick Check:
Global = everywhere, Local = one component [OK]
- Confusing global with local availability
- Thinking local registration is automatic
- Assuming global requires manual import every time
Solution
Step 1: Identify local registration syntax
Local registration uses the components option inside the component definition object.Step 2: Match correct syntax
The syntax is components: { MyComponent } to register locally.Final Answer:
components: { MyComponent } -> Option DQuick Check:
Local registration uses components: { } [OK]
- Using Vue.component() for local registration
- Confusing import statement with registration
- Trying to use globalComponents option which doesn't exist
<ParentComponent/>?
const ChildComponent = {
template: 'Child here
'
}
const ParentComponent = {
template: '',
components: { ChildComponent }
}
app.component('parent-component', ParentComponent)
app.mount('#app')Solution
Step 1: Check local registration in ParentComponent
ChildComponent is registered locally inside ParentComponent using components: { ChildComponent }.Step 2: Understand template rendering
The tag inside ParentComponent's template will render ChildComponent's templateChild here
only if the tag name matches the registered component name in kebab-case.Step 3: Identify the issue
The component is registered as ChildComponent but used as , which Vue treats as a different tag. Since 'child-component' is not globally registered, Vue will throw an unknown custom element error.Final Answer:
Error: Unknown custom element <child-component> -> Option BQuick Check:
Component names are case-sensitive and must match usage [OK]
- Assuming PascalCase component names automatically match kebab-case tags
- Forgetting to register components globally when using kebab-case tags
- Expecting local registration to work with mismatched tag names
const app = Vue.createApp({})
app.component('MyButton', {
template: 'Click me'
})
const AnotherComponent = {
template: ''
}
app.component('AnotherComponent', AnotherComponent)
app.mount('#app')Solution
Step 1: Check component registration
MyButton is registered globally using app.component('MyButton', ...), so it is available everywhere.Step 2: Check template tag casing
Vue requires component tags in templates to be kebab-case or PascalCase but HTML is case-insensitive, so should be .Final Answer:
The <MyButton /> tag inside AnotherComponent template should be lowercase <my-button />. -> Option AQuick Check:
Component tags must be kebab-case in templates [OK]
- Using PascalCase tags directly in templates
- Thinking global registration needs import in every component
- Assuming Vue.createApp() can't register components
Solution
Step 1: Consider usage frequency
The button is used many places, so global registration avoids repeated imports and registrations.Step 2: Consider component scope
The modal is used only inside one page component, so local registration keeps scope limited and reduces global clutter.Final Answer:
Register the button component globally and the modal component locally inside the page component. -> Option AQuick Check:
Global for many uses, local for few uses [OK]
- Registering rarely used components globally unnecessarily
- Registering widely used components locally repeatedly
- Ignoring app size and performance considerations
Ready to prove it?
Pass the test and this pattern moves unknown
