vue缓存keepAlive

vue缓存

keep-alive本质作用是缓存组件

路由缓存

全部缓存
    <keep-alive>
      <router-view></router-view>
    </keep-alive>

app.vue根组件

<template>
  <div id="app">
    <keep-alive>
      <router-view></router-view>
    </keep-alive>
  </div>
</template>

路由

  {
    path: '/first',
    name: 'first',
    component: () => import('../views/alive.vue/first.vue')
  },
  {
    path: '/second',
    name: 'second',
    component: () => import('../views/alive.vue/second.vue')
  },
  {
    path: '/third',
    name: 'third',
    component: () => import('../views/alive.vue/third.vue')
  }

first.vue组件

<template>
  <div class="first">
    <h1 class="title">第一个组件</h1>
    <button @click="toSecond">跳到第二个组件</button>
  </div>
</template>
<script>
export default {
  name: 'first',
  methods: {
    toSecond() {
      document.querySelector('.title').style.color = 'red'
      this.$router.push('/second')
    }
  }
}
</script>

second.vue组件

<template>
  <div class="second">
    <h1>第二个组件</h1>
    <button @click="toThird">跳到第三个组件</button>
  </div>
</template>
<script>
export default {
  name: 'second',
  created() {
    console.log('second created')
  },
  methods: {
    toThird() {
      document.querySelector('.second').style.backgroundColor = 'green'
      this.$router.push('/third')
    }
  }
}
</script>

third.vue组件

<template>
  <div class="third">
    <h1>第三个组件</h1>
  </div>
</template>

如果我点击第一页的按钮,进入second页面,点击第二页的按钮,进入第三个页面;

然后返回second,第二个组件second.vue的背景色是绿色的

再返回first,第一个组件title的文字是红色的

所有的组件都被缓存了

部分(多个或一个)缓存

修改app.vue跟组件

    <keep-alive>
      <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>

修改路由,需要缓存的路由添加meta属性,且是否缓存keepAlive键的值设置为true

  {
    path: '/first',
    name: 'first',
    component: () => import('../views/alive.vue/first.vue'),
    meta: { keepAlive: true }
  },
  {
    path: '/second',
    name: 'second',
    component: () => import('../views/alive.vue/second.vue')
  },
  {
    path: '/third',
    name: 'third',
    component: () => import('../views/alive.vue/third.vue'),
    meta: { keepAlive: false }
  }

这样和上面一样点击跳转,再返回 first=》second=》third=》second=》first

返回的时候就只有第一个页面的字体是红色的,有缓存;第二个页面的背景是白色,没缓存

缓存单个路由

再keep-alive标签内设置inlude属性,属性值为需要被缓存的路由名称

    <keep-alive include="second">
      <router-view></router-view>
    </keep-alive>

组件缓存

直接再需要被缓存的组件外加一层keep-alive标签

    <keep-alive include="second">
      <test></test>
    </keep-alive>

属性

  • include - 字符串或正则表达式。只有名称匹配的组件会被缓存。
  • exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。
  • max - 数字。最多可以缓存多少组件实例

使用keep-alive的时候也要考虑下性能,不能缓存太多的东西

生命周期

vue默认有8个生命钩子函数,但是如用了 keep-alive 的时候,activated与deactivated这了两个钩子函数也生效

钩子函数调用实际说明
activatedkeep-alive 缓存的组件激活时调用
deactivated被 keep-alive 缓存的组件失活时调用

第一次进入页面:beforeCreate=>created=>beforeMount=>mounted=>activated

离开:deactivated

再次进入:activated

原理

LRU算法:一种缓存淘汰策略(Least Recently Used);LRU判定最近使用过的数据为有用的,很久都没用过的数据是无用的,在内存满了就优先删除很久未使用,也就是无用的数据。

①接收一个capacity的参数作为缓存的最大容量

②实现put(key,value)方法存入键值对

③实现get(key)方法获取key对应的value,若不存在返回-1

具体的逻辑:

1》keep-alive在内部维护了一个key的数组和一个缓存对象,keys数组记录目前缓存的组件key值,cache对象会以key值为键,值为vnode

2》在render函数中,(针对使用keep-alive的组件)会与exclude/include黑白名单匹配,如果能匹配则继续往下执行,不能匹配(不在白名单中,或在黑名单中)则冲新生成虚拟dom

3》如果缓存过组件,则直接取出缓存,并更新组件的key在key数组中的位置;

4》如果没有缓存则在keys数组和cache对象保存此组件,并检查数量是否超过max,超过则根据LRU算法进行删除

动态缓存的实现思路

首页(A)、列表页(B)、详情页(C),一般可以从:A->B->C;

要求动态缓存B页面:C->B时保持缓存,A->B时放弃缓存

实现:

定义一个全局的缓存数组,通过keep-alive的include属性传入全局数组,或在路由的meta中通过keepAlive属性判断是否缓存

路由钩子中需修改缓存状态,beforeEach和beforeRouteLeave修改页面是否被缓存

### 回答1: Vue页面的keep-alive缓存可以通过以下方法清除: 1. 在组件中使用activated钩子函数,手动清除缓存: ``` activated() { this.$nextTick(() => { this.$refs.keepAliveComponent && this.$refs.keepAliveComponent.clearCache() }) } ``` 2. 在路由配置中使用meta属性,设置需要清除缓存路由: ``` { path: '/example', name: 'example', component: Example, meta: { keepAlive: false // 设置为false表示不缓存路由 } } ``` 3. 在组件中使用$route.meta.keepAlive属性,动态设置是否缓存: ``` <template> <div v-if="$route.meta.keepAlive">需要缓存的组件</div> <div v-else>不需要缓存的组件</div> </template> ``` 以上是清除Vue页面keep-alive缓存的方法,希望能对你有所帮助。 ### 回答2: Vue中的keep-alive组件可以缓存组件实例,当组件被切换隐藏时,它的状态将被保留,就像在内存中一样。但是,我们会发现在一些情况下,我们需要手动清除keep-alive缓存,以便重新渲染组件。 在Vue中,可以通过以下方式清除keep-alive缓存: 1. keep-alive组件内部方法: 通过在keep-alive组件的内部定义一个clear方法,我们可以手动清除缓存。 例如: <keep-alive ref="keepAlive"> <router-view></router-view> </keep-alive> methods: { clearCache() { this.$refs.keepAlive.cache = {} // 或者用this.$refs.keepAlive.$options.cache = {}, 这两种方法都可以手动清除缓存。 } } 这里,我们通过向keep-alive组件添加ref="keepAlive"来获取组件引用。然后在methods内部定义了一个clearCache方法来清除缓存。在Vue 2.3.0+版本中,keepAlive组件提供了cache属性来存储keepAlive组件缓存,我们可以通过this.$refs.keepAlive.cache={};清空缓存。 2. router钩子函数: 除了在keep-alive组件内部定义clear方法以外,我们还可以通过在router的钩子函数中实现缓存的清除。 例如: const router = new VueRouter({ routes: [ { path: '/', component: Home, meta: { keepAlive: true } }, { path: '/about', component: About } ] }) router.beforeEach((to, from, next) => { if (!to.meta.keepAlive) { clearKeepAliveCache(); } next(); }) function clearKeepAliveCache() { const cache = this.$options.cache; //获取keepAlive缓存对象 Object.keys(cache).forEach(key => { cache[key].instance.$destroy(); //销毁实例 delete cache[key]; //删除缓存 }); } 我们在VueRouter对象的routes选项中定义了meta.keepAlive属性来判断该路由是否需要缓存。接着在router.beforeEach钩子函数中通过判断meta.keepAlive,来决定是否清除keep-alive缓存。调用clearKeepAliveCache函数清除缓存。 清除缓存时,我们需要销毁实例,以避免内存泄漏。 以上是清除Vue 页面keepalive缓存的两种方法,尽管官方文档推荐第一种方法,但是当我们在不同的路由之间切换时,第二种方法较为灵活。 ### 回答3: vue页面中使用keep-alive指令会使得页面被缓存,这种缓存机制可以提高页面的性能和用户体验。但是在一些特定的场景下,需要手动清除页面缓存以达到更好的效果。这篇文章将介绍如何清除vue页面中的缓存。 一、全局清除 可以使用以下两种方法来清除vue页面的缓存。 方法1:调用$destroy()方法 在需要清除页面缓存的地方,通过访问Vue的根实例,可以得到keep-alive组件的实例。调用该实例的$destroy()方法即可清除缓存,以下是示例代码: ```javascript this.$root.$children[0].$children.find(item => item.$options.name==='keep-alive').$destroy() ``` 方法2:使用del命令 del命令可以同样实现页面缓存清除功能,这种方法只需要设置对应keep-alive组件的include属性为空数组,如下所示: ```javascript let keepAliveComponentList = this.$refs.keepAlive keepAliveComponentList.forEach(component => { component.include = [] }) ``` 二、局部清除 需要注意的是,全局清除会将所有的vue页面缓存清除,这样会带来繁琐的操作和不必要的性能消耗。因此,推荐使用局部清除来清除vue页面的缓存。 下面是一个实现局部清除的示例: ```html <template> <div> <!-- 1. 绑定 $route 参数 --> <keep-alive :include="keepAliveList"> <router-view :key="$route.fullPath"/> </keep-alive> </div> </template> <script> export default { data() { return { keepAliveList: ["home"] } }, created() { let currentName = this.$route.name this.keepAliveList.push(currentName) }, // 2. 监听 $route 对象 watch: { $route(newVal, oldVal) { if (this.keepAliveList.indexOf(newVal.name) === -1) { this.keepAliveList.push(newVal.name) } if (this.keepAliveList.indexOf(oldVal.name) !== -1) { this.keepAliveList.splice(this.keepAliveList.indexOf(oldVal.name), 1) } } } } </script> ``` 以上代码中,我们通过将已经访问过的页面名称加入数组keepAliveList中,然后将该数组绑定到keep-alive组件的include属性上,只有在该数组内的页面才会被keep-alive缓存,不在数组内的页面将会在跳转的时候被销毁。 总结: 缓存机制是前端优化中的一个重要环节,适当的使用keep-alive组件可以减少服务器的压力,提高页面性能。但是在实际应用中,我们需要考虑到缓存的清除问题,根据不同的应用场景,选择全局清除还是局部清除,以最优化的体验来满足用户需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值