理解vue中组件的缓存(keep-alive)(详细总结)

简介: 理解vue中组件的缓存(keep-alive)(详细总结)

1.keep-alive是什么

keep-alive是Vue提供的一个(抽象)组件


2.作用:


主要用于保留组件状态或避免重新渲染。

3.主要内容


3.1 两个钩子函数

activated:激活,当组件在keep-alive内被切换时,进入组件触发

deactivated:缓存,当组件在keep-alive内被切换时,离开组件触发

3.2 特点

vue官方解释:

包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在组件的父组件链中。

3.3 注意点:

只能用在只有一个子组件的情况。如果你在其中有 v-for 则不会产生效果。

3.4 keep-alive 常用的几种方式

1. 动态组件

1. <keep-alive>
2. <component :is="view"></component>
3. </keep-alive>

2. 当出现条件判断时的子组件

1. <keep-alive>
2. <comp-a v-if="a > 1"></comp-a>
3. <comp-b v-else></comp-b>
4.

3. 结合路由使用时

1.  <keep-alive>
2. <router-view></router-view>
3.  </keep-alive>

3.5 两个属性  include 与 exclude

作用:让谁缓存,就让谁缓存

特点:

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

具体使用举例:

1. <keep-alive include="a,b"></keep-alive>
2. <keep-alive :include="/a|b/"></keep-alive>
3. <keep-alive :include="['a', 'b']"></keep-alive>

4.工作中的实际使用、应用


举个例子:

手机App中,点击A模块往下滑动,假设滑动到100px,接着又点击B模块,进入B页面,然后我又跳回A页面,A页面的位置依然在100px位置处。

问题来了,假设这个产品经理,非要切回A页面位置要求在每一次进入一个组件时页面的初始位置都是保持在顶部的,何解?

下面给出两个解决方法:

4.1 利用Vue中的滚动行为

前提是你是HTML5 history模式

我们在创建一个router实例的时候,可以提供一个scrollBehavior方法,该方法会在用户切换路由时触发

const router=new VueRouter({
        routes:[
            {
                path:"/",
                component:Home
            }
        ],
        scrollBehavior(to,form,savedPosition){
        //scrollBehavior方法接收to,form路由对象
        //第三个参数savedPosition当且仅当在浏览器前进后退按钮触发时才可用
        //该方法会返回滚动位置的对象信息,如果返回false,或者是一个空的对象,那么不会发生滚动
        //我们可以在该方法中设置返回值来指定页面的滚动位置,例如:
         return {x:0,y:0}
        //表示在用户切换路由时让是所有页面都返回到顶部位置
        //如果返回savedPosition,那么在点击后退按钮时就会表现的像原生浏览器一样,返回的页面会滚动过到之前按钮点击跳转的位置,大概写法如下:
         if(savedPosition){
            return savedPosition
         }else{
           return {x:0,y:0}
         }
         //如果想要模拟滚动到锚点的行为:
         if(to.hash){
           return {
             selector:to.hash
           }
         }
     }
})

4.2 利用钩子函数

在keep-alive激活会触发activated钩子函数,那么在该函数内设置scrollTop为0

5.使用的后果及消除不利影响


5.1 问题解释:

被keep-alive包裹的组件我们请求获取的数据不会再重新渲染页面,这也就出现了例如我们使用动态路由做匹配的话页面只会保持第一次请求数据的渲染结果,所以需要我们在特定的情况下强制刷新某些组件

5.2 解决一:利用include、exclude属性

思路:只缓存我们想缓存的,使用时尽量避免

解决二:利用meta属性

export default[
 {
  path:'/',
  name:'home',
  components:Home,
  meta:{
    keepAlive:true //需要被缓存的组件
 },
 {
  path:'/book',
  name:'book',
  components:Book,
  meta:{
     keepAlive:false //不需要被缓存的组件
 } 
]
<keep-alive>
  <router-view v-if="this.$route.meat.keepAlive"></router-view>
  <!--这里是会被缓存的组件-->
</keep-alive>
<keep-alive v-if="!this.$router.meta.keepAlive"></keep-alive>
<!--这里是不会被缓存的组件-->

解决三:官方提出的解决方案响应路由参数的变化

解决四:利用berforeRouteEnter实现前进刷新,后退缓存资料

解决五:利用第三方插件实现前进刷新,后退不缓存

6.vue中强制刷新组件的方法(终极解决)


6.1 v-if

思路:直接从DOM上添加和删除

总结:太简单,太粗暴(但是太省心…),性能要求高的不要用这个

6.2 使用Vue的内置forceUpdate方法(官方推荐)

使用 this.$forceUpdate();函数在需要的地方刷新

思路:通常情况下,Vue 会通过更新视图来响应依赖项中的更改。然而,当我们调用forceUpdate时,也可以强制执行更新,即使所有依赖项实际上都没有改变。

注意:这不会更新任何计算属性,调用forceUpdate仅仅强制重新渲染视图。

代码示例:

// 全局
import Vue from 'vue';
Vue.forceUpdate();
// 使用组件实例
export default {
  methods: {
    methodThatForcesUpdate() {
      // ...
      this.$forceUpdate();
      // ...
    }
  }
}

6.3 在组件上进行 key 更改(官方推荐)

思路:利用vue的虚拟DOM中diff算法,key值改变,会引起局部刷新进而达到组件刷新的目的。

实现:我们给组件来一个  : key 绑定一个变量,然后可以设置按钮点击事件让key++,从而刷新组件,也可以用watch+时间戳实现,下面贴一个示例代码

watch:{
        "key":function(){
            this.key=new Date().getTime()
        }
    }
相关文章
|
3天前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
47 1
|
3月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
515 0
|
3月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
5月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
721 4
|
3月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件的实现代码:支持自定义表情库、快捷键发送和输入框联动的聊天表情解决方案
本文详细介绍了在 Vue 项目中实现一个功能完善、交互友好的表情包输入组件的方法,并提供了具体的应用实例。组件设计包含表情分类展示、响应式布局、与输入框的交互及样式定制等功能。通过核心技术实现,如将表情插入输入框光标位置和点击外部关闭选择器,确保用户体验流畅。同时探讨了性能优化策略,如懒加载和虚拟滚动,以及扩展性方案,如自定义主题和国际化支持。最终,展示了如何在聊天界面中集成该组件,为用户提供丰富的表情输入体验。
305 8
|
3月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
191 1
|
3月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
124 0
|
5月前
|
存储 JavaScript 前端开发
基于 ant-design-vue 和 Vue 3 封装的功能强大的表格组件
VTable 是一个基于 ant-design-vue 和 Vue 3 的多功能表格组件,支持列自定义、排序、本地化存储、行选择等功能。它继承了 Ant-Design-Vue Table 的所有特性并加以扩展,提供开箱即用的高性能体验。示例包括基础表格、可选择表格和自定义列渲染等。
396 6
|
10月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
238 64
|
10月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
333 64