Vue进阶 | 内置动态组件

390 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

动态组件是指不同组件之间进行动态切换。在 Vue 中可以通过一个特殊的 attribute:is 来实现

Vue中特殊的attribute

Vue3中有三种特殊的attribute(属性),具体如下:

  • key
  • ref :用于注册模板引用
  • is :用于绑定动态组件

注:Vue3中废弃了Vue2中的slot、slot-scope等特殊属性

image.png

内置属性 is

当有多个组件需要进行切换时,可能会想到使用 v-if 或者 v-show 来控制组件的显隐。 Vue 还为我们提供了另外一种实现方式:is 属性。

1. 使用场景:

不同组件之间进行动态切换,比如:点击不同的Tab页,界面切换显示相应的组件

image.png

2. 用法:

<component :is="currentComponent"></component>

data: {
     currentComponent: 'HOME1'
},
components: {
     HOME1: {
        template: `<h1>HOME1</h1>`
     },
     HOME2: {
        template: `<h1>HOME2</h1>`
    }
}

currentComponent :已注册组件的名字或一个组件的选项对象

3. 优化:

is 属性需要结合 <component> 组件一起使用,component 每次只能显示一个组件,组件之间切换的时候会销毁之前的组件,重新建立新的组件。所以可能会导致性能问题。

优化方法<keep-alive>

在前面 Vue进阶 | 关于 keep-alive 中有介绍过<keep-alive>的特点:

<keep-alive>是 Vue 中的内置组件。它可以使组件维持当前状态,不重新进行初始化,减少加载时间及性能消耗,自身不会渲染成一个 DOM 元素,也不会出现在父组件链中。使用它的目的是将组件缓存起来,不会进行销毁,也避免了组件的重复渲染,即“失活的组件将会被缓存”。

当组件被缓存时,或是当组件被激活时,会自动触发组件的生命周期钩子:

  • 当组件被缓存时,会自动触发 deactivated 。
  • 当组件被激活时,会自动触发 activated 。

代码实现

<keep-alive>
    <component :is="currentComponent"></component>
</keep-alive>