Dynamic Components can be used to flip through pages within your page, like tabs in your browser, with the use of the 'is' attribute.
To make a dynamic component we use the <component>
tag to represent the active component. The 'is' attribute is tied to a value with v-bind
, and we change that value to the name of the component we want to have active.
In this example we have a <component>
tag that acts as a placeholder for either the comp-one
component or the comp-two
component. The 'is' attribute is set on the <component>
tag and listens to the computed value 'activeComp' that holds either 'comp-one' or 'comp-two' as value. And we have a button that toggles a data property between 'true' and 'false' to make the computed value switch between the active components.
App.vue
:
<template>
<h1>Dynamic Components</h1>
<p>App.vue switches between which component to show.</p>
<button @click="toggleValue = !toggleValue">
Switch component
</button>
<component :is="activeComp"></component>
</template>
<script>
export default {
data() {
return {
toggleValue: true
}
},
computed: {
activeComp() {
if(this.toggleValue) {
return 'comp-one'
}
else {
return 'comp-two'
}
}
}
}
</script>
Run Example »
Run the example below. You will notice that changes you make in one component is forgotten when you switch back to it. That is because the component is unmounted and mounted again, reloading the component.
This example is the same as the previous example except the components are different. In comp-one
you can choose between 'Apple' and 'Cake', and in comp-two
you can write a message. Your inputs will be gone when you return to a component.
To keep the state, your previous inputs, when returning to a component we use the <KeepAlive>
tag around the <component>
tag.
The components now remember the user inputs.
App.vue
:
<template>
<h1>Dynamic Components</h1>
<p>App.vue switches between which component to show.</p>
<button @click="toggleValue = !toggleValue">
Switch component
</button>
<KeepAlive>
<component :is="activeComp"></component>
</KeepAlive>
</template>
Run Example »
All components inside the <KeepAlive>
tag will be kept alive by default.
But we can also define only some components to be kept alive by using 'include' or 'exclude' attributes on the <KeepAlive>
tag.
If we use the 'include' or 'exclude' attributes on the <KeepAlive>
tag we also need to give the components names with the 'name' option:
CompOne.vue
:
<script>
export default {
name: 'CompOne',
data() {
return {
imgSrc: 'img_question.svg'
}
}
}
</script>
With <KeepAlive include="CompOne">
, only the 'CompOne' component will remember its state, the previous inputs.
App.vue
:
<template>
<h1>Dynamic Components</h1>
<p>App.vue switches between which component to show.</p>
<button @click="toggleValue = !toggleValue">
Switch component
</button>
<KeepAlive include="CompOne">
<component :is="activeComp"></component>
</KeepAlive>
</template>
Run Example »
We can also use 'exclude' to choose which components to keep alive or not.
With <KeepAlive exclude="CompOne">
, only the 'CompTwo' component will remember its state.
App.vue
:
<template>
<h1>Dynamic Components</h1>
<p>App.vue switches between which component to show.</p>
<button @click="toggleValue = !toggleValue">
Switch component
</button>
<KeepAlive exclude="CompOne">
<component :is="activeComp"></component>
</KeepAlive>
</template>
Run Example »
Both 'include' and 'exclude' can be used with multiple components by using comma separation.
To show this we will add one more component so that we get three components in total.
With <KeepAlive include="CompOne, CompThree">
, both the 'CompOne' and the 'CompThree' components will remember their state.
App.vue
:
<template>
<h1>Dynamic Components</h1>
<button @click="compNbr++">
Next component
</button>
<KeepAlive include="CompOne,CompThree">
<component :is="activeComp"></component>
</KeepAlive>
</template>
Run Example »
We can use 'max' as an attribute to the <KeepAlive>
tag to limit the number of components the browser needs to remember the state of.
With <KeepAlive :max="2">
, the browser will only remember the user input of the last two visited components.
App.vue
:
<template>
<h1>Dynamic Components</h1>
<label><input type="radio" name="rbgComp" v-model="compName" :value="'comp-one'"> One</label>
<label><input type="radio" name="rbgComp" v-model="compName" :value="'comp-two'"> Two</label>
<label><input type="radio" name="rbgComp" v-model="compName" :value="'comp-three'"> Three</label>
<KeepAlive :max="2">
<component :is="activeComp"></component>
</KeepAlive>
</template>
Run Example »
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!