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 元素:要使用以下命令创建 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.

更多示例

示例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指令不适用于<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 指令