📖 Scenario: You are building a simple Vue app that shows different greetings depending on the selected language. You want to switch the greeting component dynamically based on user choice.
🎯 Goal: Create a Vue app that uses the is attribute to dynamically render one of three greeting components: EnglishGreeting, SpanishGreeting, or FrenchGreeting. The user can select the language from a dropdown, and the correct greeting component will show.
📋 What You'll Learn
Create three simple greeting components: EnglishGreeting, SpanishGreeting, FrenchGreeting
Create a reactive variable called currentLanguage to hold the selected language
Use the is attribute on <component> to render the correct greeting component dynamically
Add a dropdown <select> to change currentLanguage between 'EnglishGreeting', 'SpanishGreeting', and 'FrenchGreeting'
💡 Why This Matters
🌍 Real World
Dynamic components let you build flexible user interfaces that change based on user input or app state, like language selectors, tab views, or content previews.
💼 Career
Understanding dynamic components is key for Vue developers to create reusable and interactive UI parts efficiently.
Progress0 / 4 steps
1
Create greeting components
Create three Vue components named EnglishGreeting, SpanishGreeting, and FrenchGreeting. Each should return a simple <p> with the text 'Hello!', '¡Hola!', and 'Bonjour!' respectively.
Vue
Hint
Use defineComponent and return a p element with the greeting text inside each component.
2
Add reactive currentLanguage variable
Inside the <script setup>, create a reactive variable called currentLanguage using ref and set its initial value to 'EnglishGreeting'.
Vue
Hint
Use ref from Vue to create a reactive variable called currentLanguage and set it to 'EnglishGreeting'.
3
Use is attribute for dynamic component
In the <template>, add a <component> tag with the :is attribute bound to currentLanguage. Also, register the three greeting components in an object called components inside <script setup>.
Vue
Hint
Use <component :is="components[currentLanguage]" /> in the template and create a components object mapping the component names.
4
Add dropdown to change currentLanguage
Add a <select> element in the template with v-model bound to currentLanguage. Add three <option> elements with values 'EnglishGreeting', 'SpanishGreeting', and 'FrenchGreeting' and labels 'English', 'Spanish', and 'French'.
Vue
Hint
Use a <select> with v-model="currentLanguage" and add options for each greeting component.
Practice
(1/5)
1. What does the is attribute do in Vue's <component> tag?
easy
A. It binds data to the component's props.
B. It sets the CSS style of the component.
C. It tells Vue which component to render dynamically.
D. It triggers a lifecycle hook in the component.
Solution
Step 1: Understand the role of <component> tag
The <component> tag in Vue is a special tag used to render different components dynamically.
Step 2: Identify the purpose of the is attribute
The is attribute specifies which component to render by binding to a variable or string representing the component name.
Final Answer:
It tells Vue which component to render dynamically. -> Option C
Quick Check:
Dynamic component selection = is attribute [OK]
Hint: Remember: picks component x [OK]
Common Mistakes:
Thinking is sets styles
Confusing is with prop binding
Assuming is triggers lifecycle hooks
2. Which of the following is the correct syntax to use a dynamic component named MyButton in Vue?
easy
A.
B.
C.
D.
Solution
Step 1: Understand binding syntax for dynamic components
The is attribute must be bound with : to a variable or string. To specify a component by name as a string, use quotes inside the binding.
Step 2: Check each option's syntax
uses is="MyButton" without binding, so Vue treats it as a literal tag, not a component name. binds MyButton as a variable, but if MyButton is not defined in the script, it fails. correctly binds is to the string 'MyButton'. uses is='MyButton' without binding, which is invalid for dynamic components.
Final Answer:
<component :is='"MyButton"'></component> -> Option A
Quick Check:
Use :is with quotes for string component names [OK]
Hint: Use :is with quotes for string names, no quotes without : [OK]
Common Mistakes:
Omitting the colon for binding
Using quotes without binding
Binding to undefined variables
3. Given the Vue template:
<template>
<component :is="currentView" />
</template>
<script setup>
import HomeView from './HomeView.vue'
import AboutView from './AboutView.vue'
const currentView = ref('HomeView')
</script>
What will be rendered initially?
medium
A. The HomeView component
B. The AboutView component
C. A runtime error because currentView is a string
D. An empty component (nothing rendered)
Solution
Step 1: Analyze the value of currentView
The variable currentView is a ref holding the string 'HomeView'.
Step 2: Understand how Vue resolves dynamic components
Vue expects the is attribute to be a component object or a registered component name. Here, 'HomeView' is a string but the component is imported as HomeView object, not registered globally or locally by that string name.
Step 3: Result of passing string without registration
Since 'HomeView' is not registered as a component name, Vue renders nothing (empty component) without error.
Final Answer:
An empty component (nothing rendered) -> Option D
Quick Check:
Unregistered string name = empty render [OK]
Hint: Dynamic component string must be registered or component object [OK]
Common Mistakes:
Assuming string name auto-resolves to imported component
B. The currentComp variable should be a string, not a component object
C. Missing quotes around component name in is attribute
D. The component tag must be self-closing with a closing slash
Solution
Step 1: Check the type of currentComp
currentComp is assigned the imported component object Foo, which is valid for dynamic components.
Step 2: Verify the component tag usage
The <component> tag uses :is="currentComp" correctly, and self-closing syntax is allowed in Vue templates.
Final Answer:
No error; this code works correctly -> Option A
Quick Check:
Passing component object to :is works fine [OK]
Hint: Pass component objects directly to :is for dynamic rendering [OK]
Common Mistakes:
Thinking :is must always be a string
Confusing self-closing tags as errors
Expecting quotes around component objects
5. You want to switch between three components HomeView, ProfileView, and SettingsView dynamically based on a button click. Which approach correctly implements this using Vue's dynamic components?