Vue <component> 元素
示例
使用内置的 <component>
元素和 is
属性创建动态组件。
<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>
运行示例 »
在下面查看更多示例。
定义和用法
内置的 <component>
元素与内置的 is
属性一起使用,以创建 HTML 元素或 Vue 组件。
HTML 元素:要使用 <component>
元素创建 HTML 元素,将 is
属性设置为我们要创建的 HTML 元素的名称,可以直接设置(示例 1),也可以使用 v-bind
动态设置(示例 2)。
Vue 组件:要使用 <component>
元素渲染 Vue 组件,将 is
属性设置为我们要创建的 Vue 组件的名称,可以直接设置(示例 3),也可以使用 v-bind
动态设置以创建动态组件(示例 4)。
创建动态组件时,可以在 <component>
元素周围使用内置的 <KeepAlive>
组件来记住未激活组件的状态。(示例 5)
还可以使用带有 is
属性的三元表达式更改动态组件中的活动组件。(示例 6)
注意: v-model
指令不适用于使用 <component>
元素创建的原生 HTML 表单输入标签(例如 <input>
或 <option>
)。(示例 7)
Props
Prop | 描述 |
---|---|
is | 必需。设置为应激活的组件,或设置为要创建的 HTML 元素。 |
更多示例
示例 1
使用内置的 <component>
元素创建 <div>
元素。
<template>
<h2>Example Built-in 'component' Element</h2>
<p>The component element is rendered as a div element with is="div":</p>
<component is="div">This is a DIV element</component>
</template>
<style scoped>
div {
border: solid black 1px;
background-color: lightgreen;
}
</style>
运行示例 »
示例 2
使用内置的 <component>
元素在有序列表和无序列表之间切换。
<template>
<h2>Example Built-in 'component' Element</h2>
<p>Using the component element to toggle between an ordered list (ol), and an unordered list (ul):</p>
<button v-on:click="toggleValue = !toggleValue">Toggle</button>
<p>Animals from around the world</p>
<component :is="tagType">
<li>Kiwi</li>
<li>Jaguar</li>
<li>Bison</li>
<li>Snow Leopard</li>
</component>
</template>
<script>
export default {
data() {
return {
toggleValue: true
}
},
computed: {
tagType() {
if (this.toggleValue) {
return 'ol'
}
else {
return 'ul'
}
}
}
}
</script>
运行示例 »
示例 3
使用内置的 <component>
元素通过将组件名称提供给 is
属性来渲染组件。
App.vue
:
<template>
<h2>Example Built-in 'is' Attribute</h2>
<p>The component element below is set to be a component by the use of 'is="child-comp"'.</p>
<component is="child-comp"></component>
</template>
ChildComp.vue
:
<template>
<div>
<h3>ChildComp.vue</h3>
<p>This is the child component</p>
</div>
</template>
<style scoped>
div {
border: solid black 1px;
background-color: lightgreen;
padding: 10px;
max-width: 250px;
margin-top: 20px;
}
</style>
运行示例 »
示例 4
使用内置的 <component>
元素创建动态组件,我们可以在两个组件之间切换。
<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>
<style>
#app {
width: 350px;
margin: 10px;
}
#app > div {
border: solid black 2px;
padding: 10px;
margin-top: 10px;
}
</style>
运行示例 »
示例 5
内置的 <KeepAlive>
组件用于在 <component>
元素周围,以记住在组件之间切换时输入的值。
<template>
<h1>Dynamic Components</h1>
<p>App.vue switches between which component to show.</p>
<p>With the <KeepAlive> tag the components now remember the user inputs.</p>
<button @click="toggleValue = !toggleValue">Switch component</button>
<KeepAlive>
<component :is="activeComp"></component>
</KeepAlive>
</template>
<script>
export default {
data () {
return {
toggleValue: true
}
},
computed: {
activeComp() {
if(this.toggleValue) {
return 'comp-one'
}
else {
return 'comp-two'
}
}
}
}
</script>
<style>
#app {
width: 350px;
margin: 10px;
}
#app > div {
border: solid black 2px;
padding: 10px;
margin-top: 10px;
}
h2 {
text-decoration: underline;
}
</style>
运行示例 »
示例 6
使用 <component>
元素和 is
属性以及三元表达式来切换应激活的组件。
<template>
<h1>Dynamic Components</h1>
<p>Refresh the page and there is a chance the dynamic component will toggle.</p>
<component :is="Math.random() > 0.5 ? 'comp-one' : 'comp-two'"></component>
</template>
<style>
#app {
width: 350px;
margin: 10px;
}
#app > div {
border: solid black 2px;
padding: 10px;
margin-top: 10px;
}
</style>
运行示例 »
示例 7
演示 v-model
指令不适用于使用 <component>
元素创建的 <input>
元素。
<template>
<h1>Dynamic Components</h1>
<p><mark>The v-model directive does not work with input element created with the component element.</mark></p>
<hr>
<p>Does not work, not updating:</p>
<component is="input" type="number" v-model="inpVal1"></component> (try to change value)
<p class="pResult1">inpVal1: {{ inpVal1 }}</p>
<hr>
<p>How it should work, updates:</p>
<input type="number" v-model="inpVal2"> (try to change value)
<p class="pResult2">inpVal2: {{ inpVal2 }}</p>
</template>
<script>
export default {
data() {
return {
inpVal1: 4,
inpVal2: 7,
}
}
}
</script>
<style>
#app {
width: 350px;
margin: 10px;
}
.pResult1 {
background-color: lightpink;
font-family: 'Courier New', Courier, monospace;
font-weight: bold;
padding: 5px;
}
.pResult2 {
background-color: lightgreen;
font-family: 'Courier New', Courier, monospace;
font-weight: bold;
padding: 5px;
}
</style>
运行示例 »
相关页面
Vue 教程:Vue 组件
Vue 教程:动态组件
Vue 教程:Vue 表单输入
Vue 教程:Vue v-model 指令
Vue 参考:Vue is 属性
Vue 参考:Vue v-bind 指令
Vue 参考:Vue v-model 指令