项目中,经常会遇到不同组件之间进行动态切换,如 Tab 菜单栏。

通常的实现方式,我们会选择二级路由,但是这就需要管理路由,所以使用起来并不是特别方便。
动态组件的方式,给我们带来了更简洁的动态切换组件的方式。
在 Vue 中,通过给 <component> 元素添加 is 属性来实现动态组件切换业务。
is 表示要动态加载的组件名称或组件的选项对象。
1 | <!-- 组件会在 `currentTabComponent` 改变时改变 --> |
运用
如上图所示需求,具体实现如下
1 | <div id="app"> |
当点击 button 按钮时,tabItem 的值会被设置为一个组件的名字(tab-item-one or tab-item-two),并赋值给 is 属性,那么 <component> 就会动态的替换为对应名称的组件。这就是动态组件的实现。
但是上面的代码也会存在一个问题,就是动态组件切换时,会把之前的组件销毁,等到再次切换到某一组件时,其实是重新创建了该组件。这样就无法使得组件在切换时,无法保留之前的状态了!
例如,我们把组件 tab-item-one 调整一下:
1 | Vue.component('tab-item-one', { |
页面效果如图所示

当切换到组件 tab-item-one ,将 checkbox 勾选框选中为勾选状态,然后选中 tab-item-two 切换到 tab-item-two 组件,再次选中 tab-item-one,我们会发现组件内的checkbox 处于未勾选的状态。即我们tab-item-two 的状态丢失了。
正如我们上面说的,动态组件在切换时,是基于销毁和创建新组件的过程。那么对于需要保留已显示过的组件,如何保留其状态呢?
答案就是,使用 <keep-alive> ,将组件设置为状态持续。
因此我们队代码进行如下修正:
1 | <div id="app"> |
这样一来,切换过程中就会将所有的组件状态进行保存了。对于动态组件的使用我们已经了解了,至于如何更优雅的使用,就需要结合实际的场景了。