当前位置: 首页 > article >正文

vue中keep-alive组件的使用

keep-alive是vue的内置组件,它的主要作用是对组件进行缓存,避免组件在切换时被重复创建和销毁,从而提高应用的性能和用户体验。它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。使用时,只需要将需要缓存的组件包裹在keep-alive标签内即可。

使用

首先声明两个组件keepCompont1.vue,keepCompont2.vue 

<template>
    <div>
      <p>这是 keepCompont1</p>
      <input v-model="inputValue" placeholder="输入内容">
    </div>
  </template>
  
  <script>
  export default {
    data() {
      return {
        inputValue: ''
      };
    },
    created() {
      console.log('keepCompont1 created');
    },
    mounted() {
      console.log('keepCompont1 mounted');
    },
    activated() {
      console.log('keepCompont1 activated');
    },
    deactivated() {
      console.log('keepCompont1 deactivated');
    },
    destroyed() {
      console.log('keepCompont1 destroyed');
    }
  };
  </script>
  
  <style scoped></style>
<template>
    <div>
      <p>这是 keepCompont2</p>
      <input v-model="inputValue" placeholder="输入内容">
    </div>
  </template>
  
  <script>
  export default {
    data() {
      return {
        inputValue: ''
      };
    },
    created() {
      console.log('keepCompont2 created');
    },
    mounted() {
      console.log('keepCompont2 mounted');
    },
    activated() {
      console.log('keepCompont2 activated');
    },
    deactivated() {
      console.log('keepCompont2 deactivated');
    },
    destroyed() {
      console.log('keepCompont2 destroyed');
    }
  };
  </script>
  
  <style scoped></style>

生命周期里面打印了信息来确认那些生命周期执行了,activated和deactivated是keep-alive组件特有的生命周期,组件被激活执行activated,组件隐藏的时候执行deactivated。对于vue生命周期不理解的可以看下这里,详细说了下生命周期的作用和执行顺序。vue生命周期和应用

父组件代码:

<template>
  <div>
    <button @click="toggleComponent">切换组件</button>
    <keep-alive >
      <!-- is绑定的值即为当前显示的组件,需要切换的时候需要动态绑定。  -->
      <component :is="currentComponent"></component>
    </keep-alive>
  </div>
</template>

<script>
import keepCompont1 from "@/components/keepCompont1.vue";
import keepCompont2 from "@/components/keepCompont2.vue";
export default {
  components: {
    keepCompont1,
    keepCompont2,
  },
  data() {
    return {
        // 默认显示keepCompont1组件
      currentComponent: "keepCompont1",
    };
  },

  methods: {
    // 修改currentComponent的值来切换组件
    toggleComponent() {
        //  this.currentComponent === 'keepCompont2' ? 'keepCompont1' : 'keepCompont2'; 
        //  三元运算符做了一个判断 
        //  this.currentComponent === 'keepCompont2'为true 
        //  则把keepCompont1 赋值给this.currentComponent。false则把keepCompont2赋值过去
      this.currentComponent = this.currentComponent === 
      'keepCompont2' ? 'keepCompont1' : 'keepCompont2';
    },
  },
};
</script>

运行效果:

当页面加载完成后可以看到keepCompont1组件的created,mounted,activated生命周期函数执行了。

keepCompont1组件的输入框输入内容1111,点击切换按钮。keepCompont2组件显示出来且created,mounted,activated生命周期函数执行且keepCompont1组件隐藏了且执行了deactivated

 然后我们来验证keepCompont1组件刚才输入的内容1111 是否缓存上了,这里在组件2的输入框里面输入222,然后点击切换按钮。

切换回来后可以看到输入框里面的1111还在,并且从打印的生命周期上可以看到destroyed钩子函数并没有执行也就是说没有销毁在重新创建组件。 在次点击切换按钮可以看到组件2里面的2222也是存在的。整个过程destroyed钩子函数都没有执行

keep-alive组件有三个常用的属性:include,exclude,max

 include

include值为字符串或正则表达式,只有名称匹配的组件会被缓存,如果不使用include属性则默认缓存所有。这里在创建一个keepCompont3组件,内容和keepCompont1和keepCompont2一样的唯一区别就是修改下生命周期的打印,这里就不在粘贴重复的代码了。稍微修改下父组件

<template>
  <div>
    <button @click="toggleComponent">切换组件</button>
    <!-- 添加一个按钮 用来显示组件3 -->
    <button @click="show3">显示组件3</button>
    <keep-alive include="keepCompont1,keepCompont2">
      <!-- is绑定的值即为当前显示的组件,需要切换的时候需要动态绑定。  -->
      <component :is="currentComponent"></component>
    </keep-alive>
  </div>
</template>

<script>
import keepCompont1 from "@/components/keepCompont1.vue";
import keepCompont2 from "@/components/keepCompont2.vue";
import keepCompont3 from "@/components/keepCompont3.vue";
export default {
  components: {
    keepCompont1,
    keepCompont2,
    keepCompont3
  },
  data() {
    return {
        // 默认显示keepCompont1组件
      currentComponent: "keepCompont1",
    };
  },

  methods: {
    // 修改currentComponent的值来切换组件
    toggleComponent() {
        // this.currentComponent === 'keepCompont2' ? 'keepCompont1' : 'keepCompont2'; 三元运算符做了一个判断 
        //  this.currentComponent === 'keepCompont2'为true 则把keepCompont1 赋值给this.currentComponent。
        // false则把keepCompont2赋值过去
      this.currentComponent = this.currentComponent === 
      'keepCompont2' ? 'keepCompont1' : 'keepCompont2';
    },
    show3(){
        this.currentComponent = 'keepCompont3'
    }
  },
};
</script>

这里include没有包含keepCompont3组件,当组件3隐藏在出现的时候不会缓存输入框里面的值,因为组件被销毁了,执行了destroyed生命周期函数

这里可以看到当最后进入组件3的时候,组件3的created钩子函数也执行了,说明组件又重新创建了。

exclude

值为字符串或正则表达式,名称匹配的组件不会被缓存。

 <keep-alive include="keepCompont1,keepCompont2,keepCompont2" exclude="keepCompont2">
      <!-- is绑定的值即为当前显示的组件,需要切换的时候需要动态绑定。  -->
      <component :is="currentComponent"></component>
    </keep-alive>

运行效果

max 

值为数字,最多可以缓存多少组件实例。假如存储的实例大于设置的数字,则会触发LUR淘汰机制。比如:假如设置最大缓存数量为2,先切换到了组件1和组件2,此时组件1,组件2会被缓存,当切换到组件3的时候,由于已经到了最大缓存数量,组件1和组件2中最久没有使用的那个组件实例会被淘汰。

LRU 算法的核心思想是:当缓存空间满了需要淘汰一个元素时,会选择最久没有被访问过的元素进行淘汰。

end

后续更新一些keep-alive组件的使用场景demo(如有误欢迎指正)


http://www.kler.cn/a/599153.html

相关文章:

  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例14,TableView15_14多功能组合的导出表格示例
  • C++——权限初识
  • 炫酷的3D卡片翻转画廊实现教程
  • 使用ES支持树状结构查询实战
  • 蓝桥杯 - 中等 - 智能停车系统
  • 大数据(2)Hadoop架构深度拆解:HDFS与MapReduce企业级实战与高阶调优
  • 《TCP/IP网络编程》学习笔记 | Chapter 21:异步通知 I/O 模型
  • MQ 消息幂等性保证
  • Pycharm社区版创建Flask项目详解
  • 大数据学习(84)-Hive数仓
  • WPF TemplateBinding与TemplatedParent区别
  • 面试计算机操作系统解析(一中)
  • 基于模糊PID算法的智能洗衣机控制器设计,实现洗衣过程智能化,能够监测衣物重量和污泥,实现洗涤时间、洗衣液投放的智能控制
  • 题解:AT_abc170_f [ABC170F] Pond Skater
  • Mellanox 网卡的工作模式自动化修改脚本(实战生产,复制即可使用)
  • 解决IDEA中maven找不到依赖项的问题
  • 排序复习_代码纯享
  • centos7 升级MariaDB 到 10.5 或更高版本
  • 全星FMEA软件系统:FMEA、CP、PFD速效解决方案
  • 使用Github项目nghttp2的样例学习HTTP/2