vue使用keep-alive缓存组件,vue keep alive 动态清除

  vue使用keep-alive缓存组件,vue keep alive 动态清除

  说到Vue缓存,首先要选择官方的缓存方案keep-alive。本文主要介绍了Vue及时清理keepalive缓存方案的详细解决方案,通过示例代码进行了非常详细的介绍,对大家的学习或者工作有一定的参考价值。有需要的朋友可以和边肖一起学习。

  

目录

  尝试思考需求。1.手动操作保活组件的缓存阵列。2.排除要演示的解决方案。

  

需求

  在单页应用程序中,用户在进入表单填写页面时需要初始化表单的内容。在填充过程中,可能会涉及到地图选择或列表选择等操作,因此需要选择一个新页面并回调显示。

  这时,我们需要缓存表单填写的页面实例。当我们退出表单填写或者提交表单内容时,需要销毁当前的表单实例,下次再重新初始化。

  

思考

  说到Vue缓存,首先要选择官方缓存方案keep-alive的内置组件来实现。

  Keep-alive组件为我们提供了缓存组件的能力,可以完整的保存组件的当前状态,这对我们帮助很大。

  然而,在实际的业务场景中,我们经常按需缓存页面,就像在App开发中一样。每个页面都是一个单独的页面实例。由于Vue路由器的限制,每个页面都有一个固定的路径,所以每次访问这个路径都会碰到同一个组件实例。

  这时,有些朋友可能会说

  诶,激活不能用于页面更新或者处理吗?

  是的,可以。但是有些操作需要在mounted中完成,有些需要在activated中更新,代码还要处理很多进入页面的操作,非常麻烦。

  此时就有两个思考方向:

  必要时清除缓存页面的实例。每次推送页面时,确保当前页面是一个全新的实例对象。第二种方案,和App页面栈一样,物理上可以解决需求中的问题,但是需要做的改动很多。比如在Vue路由器中切换路由时,是否使用动态生成路径来保证当前页面实例不唯一,而且,要自己做好页面栈管理,类似于iOS中的UINavigationController,以便及时清理栈中缓存的页面实例。

  因为变化比较大,需要大量测试,所以最终选择方案一方向探索尝试。

  

尝试

  

1. 手动操作 keep-alive 组件的 cache 数组

  //Vue 2保活部分源代码片段

  const { cache,keys }=this

  常量键:字符串=

  vnode.key==null

  ?//同一个构造函数可能被注册为不同的本地组件

  //所以只有cid是不够的(#3269)

  组件选项。Ctor.cid (componentOptions.tag?`:${componentOptions.tag} `: )

  :vnode.key

  if(缓存[键]) {

  vnode . component instance=cache[key]。componentInstance

  //使当前密钥最新

  取出(钥匙,钥匙);

  keys.push(按键);

  }否则{

  //延迟设置缓存,直到更新

  this.vnodeToCache=vnode

  this.keyToCache=key

  }

  在特定情况下,使用路由守卫删除缓存数组中的页面实例,同时销毁当前实例。

  removeKeepAliveCacheForVueInstance(vueInstance){

  字母键=

  vueInstance。$vnode.key?

  vueInstance。$ vnode . component options . ctor . cid(vue instance。$vnode.componentOptions.tag?`:${vueInstance。$ vnode . component options . tag } `: );

  让cache=vueInstance。$ vnode . parent . component instance . cache;

  让keys=vueInstance。$ vnode . parent . component instance . keys;

  if(缓存[键]) {

  vueInstance。$ destroy();

  删除缓存[键];

  let index=keys . index of(key);

  if (index -1) {

  keys.splice(索引,1);

  }

  }

  }

  这个方案比较繁琐,但是因为是直接操作缓存数组,所以可能会造成一些意想不到的泄漏问题或者运行问题,虽然我自己试的时候没有发现。

  在Vue 3中,我也尝试寻找对应的缓存数组,确实找到了。但是Vue 3源代码中缓存数组的操作权限仅限于开发环境。

  //Vue 3 KeepAlive组件片段

  if(_ _ DEV _ _ _ _ FEATURE _ PROD _ DEV tools _ _){

  ;(任何实例)。__v_cache=缓存

  }

  部署生产环境后,无法通过实例获取缓存阵列。__v_cache,所以这个方案在Vue 3中无法进行。

  结果有了第二次尝试。

  

2. exclude 大法好

  在联系keep-alive之前,所有的注意力都放在include属性上。其实exclude属性同样重要,效果和直接删除缓存数组差不多。

  //Vue 3 KeepAlive组件片段

  如果(

  (包括(!名字!匹配项(包括,名称)))

  (排除名称匹配(排除,名称))

  ) {

  电流=vnode

  返回rawVNode

  }

  如果exclude中有一个值,那么将返回当前的新实例,而不是从缓存中获取。并且exclude的优先级高于include。

  这样,我们可以通过操作exclude的内容来控制缓存页面。

  而且Vue 3中exclude的控制更加方便。您只需要定义一个全局排除响应变量,就可以在任何地方操作。具体的清算方式取决于业务流程。

  export const excludes=ref string[]([]);

  //需要删除的时候

  导出函数removeKeepAliveCache(名称:字符串){

  excludes.value.push(名称);

  }

  //当需要恢复缓存时

  导出函数resetKeepAliveCache(名称:字符串){

  excludes . value=excludes . value . filter((item)=item!==姓名);

  }

  

Demo

  下面是一个演示高速缓存清除效果的小演示:

  https://ztstory.github.io/vue-composition-demo/#/

  流程:

  索引和输入是缓存页面。

  返回索引时清除输入缓存,并重新进入输入页面以激活缓存。

  演示源代码地址:https://github.com/ZTStory/vue-composition-demo

  关于Vue及时清理keepalive缓存的详细说明,本文到此结束。关于Vue清理keepalive缓存的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: