Vue.js Dynamic Component Rendering
In the last chapter have already seen quite a few examples of flexible components using render functions which give us a lot of power. But, since rendering a component dynamically via it's name is such a typical use case there is built-in support for that in Vue.js.
In this chapter we discuss the usage of the <component> tag.
Using the <component is> feature #
As an example we use a tab navigation where the content of a tab is rendered dynamically.

Let's start with the tab content:
Vue.component('tab-home', {
template: '<div>Home component</div>'
});
Vue.component('tab-posts', {
template: '<div>Posts component</div>'
});
Vue.component('tab-archive', {
template: '<div>Archive component</div>'
});I'm using a common name prefix tab- here to make it easier to lookup these components later.
Now, to render the component dynamically we use the <component> tag and give it a name via the is prop:
<component is="tab-home"></component>It is that simple! Vue then lookups the component referenced by that String and renders it in place of the <component> tag.
Now, this example is still static, let make it more dynamic. First we need to manage all our tabs in the Vue.js app:
new Vue({
el: '#demo',
data: {
currentTab: 'Home',
tabs: ['Home', 'Posts', 'Archive']
},
computed: {
currentTabComponent: function () {
return 'tab-' + this.currentTab.toLowerCase()
}
}
});We use the tabs for the list of all tabs we want to render and the currentTab to maintain the selection. The actual component's name is concatenated as a computed property currentTabComponent.
Next we look into the markup to render the tabs:
<div id="demo">
<ul class="tab-list">
<li
v-for="tab in tabs"
:key="tab"
>
<a
:class="['tab', { active: currentTab === tab }]"
@click="currentTab = tab">
</a>
</li>
</ul>
<component
:is="currentTabComponent"
class="tab-content">
</component>
</div>You can find the complete example on GitHub
We use a v-for directive to render a list of tabs using the currentTab to set the active class. The @click event is used to change the currentTab state. Clicking on a tab will change the background-color to visually indicate the active state.
The <component> uses the currentTabComponent computed property to render the active tab content.
Note, how it passes along the class prop to the actual component it renders. Nice!
Summary #
The <component> tag is quite a powerful feature and in some use cases it might be easier to use instead of slots and custom code.
