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 选项

Props 选项 描述
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

通过向 is 属性提供组件名称,使用内置 <component> 元素来呈现组件。

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 指令