Vue 动态组件

使用 'is' 属性,动态组件可以用于在页面中翻转页面,就像浏览器中的选项卡一样。


组件标记和 is 属性

为了制作动态组件,我们使用 <component> 标记来表示活动组件。'is' 属性通过 v-bind 绑定到一个值,我们将该值更改为要激活的组件的名称。

实例

在本例中,我们有一个 <component> 标记,它充当 comp-one 组件或 comp-two 组件的占位符。'is' 属性在 <component> 标记上设置,并监听将 'comp-one' 或 'comp-two' 作为值的计算值 'activeComp'。我们有一个按钮,可以在 truefalse 之间切换数据属性,以使计算值在活动组件之间切换。

App.vue:

  1. <template>
  2. <h1>Dynamic Components</h1>
  3. <p>App.vue switches between which component to show.</p>
  4. <button @click="toggleValue = !toggleValue">
  5. Switch component
  6. </button>
  7. <component :is="activeComp"></component>
  8. </template>
  9. <script>
  10. export default {
  11. data() {
  12. return {
  13. toggleValue: true
  14. }
  15. },
  16. computed: {
  17. activeComp() {
  18. if(this.toggleValue) {
  19. return 'comp-one'
  20. }
  21. else {
  22. return 'comp-two'
  23. }
  24. }
  25. }
  26. }
  27. </script>

<KeepAlive>

运行下面的实例。当你切换回某个组件时,你会注意到你在该组件中所做的更改没有了。这是因为该组件被卸载并重新装载,从而重新加载该组件。

实例

为了保持状态,即您以前的输入,当返回到组件时,我们在 <component> 标记周围使用 <KeepAlive> 标记。

实例

组件现在记住用户输入。

App.vue:

  1. <template>
  2. <h1>Dynamic Components</h1>
  3. <p>App.vue switches between which component to show.</p>
  4. <button @click="toggleValue = !toggleValue">
  5. Switch component
  6. </button>
  7. <KeepAlive>
  8. <component :is="activeComp"></component>
  9. </KeepAlive>
  10. </template>

include 和 exclude 属性

组件现在记住用户输入。默认情况下,<KeepAlive> 标记内的所有组件都将保持活动状态。

但是,我们也可以通过在 <KeepAlive> 标记上使用 'include' 或 'exclude' 属性,只定义一些要保持活动的组件。

如果我们在 <KeepAlive> 标记上使用 'include' 或 'exclude' 属性,我们还需要使用 'name' 选项为组件命名:

CompOne.vue:

  1. <script>
  2. export default {
  3. name: 'CompOne',
  4. data() {
  5. return {
  6. imgSrc: 'img_question.svg'
  7. }
  8. }
  9. }
  10. </script>
实例

使用 <KeepAlive include="CompOne">, 只有 'CompOne' 组件会记住其状态,即以前的输入。

App.vue:

  1. <template>
  2. <h1>Dynamic Components</h1>
  3. <p>App.vue switches between which component to show.</p>
  4. <button @click="toggleValue = !toggleValue">
  5. Switch component
  6. </button>
  7. <KeepAlive include="CompOne">
  8. <component :is="activeComp"></component>
  9. </KeepAlive>
  10. </template>

我们还可以使用 'exclude' 来选择哪些组件要保持活动状态。

实例

使用 <KeepAlive exclude="CompOne"> ,只有 'CompTwo' 组件会记住其状态。

App.vue:

  1. <template>
  2. <h1>Dynamic Components</h1>
  3. <p>App.vue switches between which component to show.</p>
  4. <button @click="toggleValue = !toggleValue">
  5. Switch component
  6. </button>
  7. <KeepAlive exclude="CompOne">
  8. <component :is="activeComp"></component>
  9. </KeepAlive>
  10. </template>

通过使用逗号分隔,'include' 和 'exclude' 都可以与多个组件一起使用。

为了显示这一点,我们将再添加一个组件,这样我们总共得到三个组件。

实例

使用 <KeepAlive include="CompOne, CompThree">, 'CompOne' 和 'CompThree' 组件都会记住它们的状态。

App.vue:

  1. <template>
  2. <h1>Dynamic Components</h1>
  3. <button @click="compNbr++">
  4. Next component
  5. </button>
  6. <KeepAlive include="CompOne,CompThree">
  7. <component :is="activeComp"></component>
  8. </KeepAlive>
  9. </template>

max 属性

我们可以使用 'max' 作为 <KeepAlive> 标记的属性,以限制浏览器需要记住状态的组件数量。

实例

使用 <KeepAlive :max="2">, 浏览器将只记住最后两个访问的组件的用户输入。

App.vue:

  1. <template>
  2. <h1>Dynamic Components</h1>
  3. <label><input type="radio" name="rbgComp" v-model="compName" :value="'comp-one'"> One</label>
  4. <label><input type="radio" name="rbgComp" v-model="compName" :value="'comp-two'"> Two</label>
  5. <label><input type="radio" name="rbgComp" v-model="compName" :value="'comp-three'"> Three</label>
  6. <KeepAlive :max="2">
  7. <component :is="activeComp"></component>
  8. </KeepAlive>
  9. </template>