使用内置的<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 元素:要使用以下命令创建 HTML 元素<component>
元素,即is
属性设置为等于我们要创建的 HTML 元素的名称,可以直接设置(示例 1),也可以使用动态设置v-bind
(示例2)。
Vue组件:使用以下方式渲染 Vue 组件<component>
元素,即is
属性设置为等于我们要创建的 Vue 组件的名称,可以直接 (示例3),或者动态地使用v-bind
创建动态组件(示例4)。
创建动态组件时,内置<KeepAlive>
组件可以在周围使用<component>
元素来记住不活动组件的状态。 (示例5)
动态组件中的活动组件也可以通过使用三元表达式来更改is
属性。 (示例6)
笔记:这个v-model
指令不适用于本机 HTML 表单输入标记(例如<input>
或者<option>
)创建与<component>
元素。 (示例7)
Prop | Description |
---|---|
is | Required. Is set equal to the component that should be active, or is set equal to the HTML element to be created. |
使用内置的<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>
运行示例 »
使用内置的<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>
运行示例 »
使用内置的<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>
运行示例 »
使用内置的<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>
运行示例 »
内置的<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>
运行示例 »
使用<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>
运行示例 »
证明了v-model
指令不适用于<input>
使用创建的元素<component>
元素。
<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 是属性
Vue参考:Vue v-bind 指令
Vue参考:Vue v-model 指令
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!