一、动态组件的基本使用

Vue 中提供了一个 <component> 元素,搭配 is属性来实现动态组件。

  1. <template>
  2. <div>
  3. <component :is="current"></component>
  4. </div>
  5. </template>
  6. <script>
  7. import Home from "./Home.vue";
  8. export default {
  9. components: {
  10. Home
  11. },
  12. data() {
  13. return {
  14. current: "Home",
  15. };
  16. },
  17. };
  18. </script>

is属性用来设置<component>要显示的组件名称。当我们通过事件将current的值修改为其他组件的名字,就能实现组件之间的动态切换了。
示例代码如下:

  1. <template>
  2. <div>
  3. <button @click="current = 'Home'">Home</button>
  4. <button @click="current = 'Posts'">Posts</button>
  5. <button @click="current = 'Archive'">Archive</button>
  6. <component :is="current"></component>
  7. </div>
  8. </template>
  9. <script>
  10. import Home from "./Home.vue";
  11. import Posts from "./Posts.vue";
  12. import Archive from "./Archive.vue";
  13. export default {
  14. components: {
  15. Home,
  16. Posts,
  17. Archive,
  18. },
  19. data() {
  20. return {
  21. current: "Home",
  22. };
  23. },
  24. };
  25. </script>

二、动态组件的生命周期

动态组件在切换的过程中,会不断的进行销毁和重建。
也就意味着,当前组件被切换走的时候,会被销毁,会触发销毁阶段的两个生命周期函数:

  1. export default {
  2. beforeDestroy() {
  3. console.log('组件销毁前');
  4. },
  5. destroyed() {
  6. console.log('组件销毁完成');
  7. }
  8. }

新组件被切换显示出来时,会被重建,会触发创建阶段和挂载阶段的四个生命周期函数:

  1. export default {
  2. beforeCreate() {
  3. console.log("组件创建前");
  4. },
  5. created() {
  6. console.log("组件创建完成");
  7. },
  8. beforeMount() {
  9. console.log("组件挂载前");
  10. },
  11. mounted() {
  12. console.log("组件挂载完成");
  13. }
  14. };

keep-alive

一、基本使用

<keep-alive> 用来包裹 Vue 应用中需要缓存状态的组件。

  1. <template>
  2. <keep-alive>
  3. <component :is=""></component>
  4. </keep-alive>
  5. </template>
  6. <script>
  7. export default {
  8. }
  9. </script>

当动态组件被<keep-alive>包裹后,所有组件的状态都会保留在内存中。在后续动态组件的切换过程中,组件不会再经历销毁和重新。从而有效的防止了 DOM 的重复渲染,减少组件加载时间及性能消耗,提高了用户体验性。

二、keep-alive 的属性

<keep-alive>组件中还提供了以下属性:

  • include - 字符串或正则表达式。只有名称匹配的组件会被缓存。
  • exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。

    1. <!-- 只有组件名为 TabA 的组件被缓存 -->
    2. <keep-alive include="TabA">
    3. <component :is="current"></component>
    4. </keep-alive>
    5. <!-- 只有组件名为 TabA 或 TabB 的组件被缓存 -->
    6. <keep-alive :include="/Tab(A|B)/">
    7. <component :is="current"></component>
    8. </keep-alive>
    9. <!-- 除了组件名叫 TabA 的组件不被缓存,其他组件都被缓存 -->
    10. <keep-alive exclude="TabA">
    11. <component :is="current"></component>
    12. </keep-alive>

    三、生命周期函数

    被包含在<keep-alive>中的组件,会比普通组件多出两个生命周期函数:activateddeactivated

  • activated:在<keep-alive>中组件被激活时调用,即进入组件时;

  • deactivated:在<keep-alive>中组件停用时调用,即离开组件时。
    1. export default {
    2. activated() {
    3. console.log("进入组件时");
    4. },
    5. deactivated() {
    6. console.log("离开组件时");
    7. },
    8. };
    使用<keep-alive>包裹组件,会将组件的数据保留在内存中。如果希望每次进入页面时都获取最新的数据,需要在activated阶段获取数据,承担原来mounted钩子函数中获取数据的任务。