vue缓存机制 keep-alive

本文介绍如何使用Vue.js的keep-alive特性实现页面缓存,避免重复加载数据,从而提高用户体验和减轻服务器负担。通过配置路由元信息,可以灵活地控制哪些页面启用缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

到现在,接触vue也小段时间了,项目进行到了一定程度,然而项目缺少了缓存机制,所以每次跳转页面都会重新created一下数据,虽说系统的数据请求速度很快,但是这样做对系统的性能会有很大的坏处的,所以到这里就要对系统优化下,添加缓存了。
其实到现在,对于vue还是没有玩通,每深挖一次,就会发现一次vue的精彩,开始不清楚要用什么实现缓存,找了好久,有好几种说法,就是用vuex、vuet或者keep-alive,然后对比了一下,在我认为,vuex和vuet是实现状态管理,重心是在数据处理上;想要实现整体的缓存,阻止created的刷新,就要用keep-alive。
所以这里我想要给大家介绍下如何用keep-alive实现缓存的页面?其实很简单,就是几句话而已。

1、keep-alive要配合router-view使用,这里要注意一点就是,keep-alive本身是vue2.0的功能,并不是vue-router的,所以再vue1.0版本是不支持的。keep-alive官方文档点这里,代码实现如下,router-view是在入口APP.vue里面

<template>
  <div id="app">

    <keep-alive>
      <router-view></router-view>
    </keep-alive>
    
    <!--这里是其他的代码-->
  </div>
</template>

2、这样就会实现组件的缓存,但是有个缺点就是所有组件都会被缓存,可是现实中就是我们有些页面还是要及时刷新的,比如列表数据,想要查看详情的时候都是共用一个组件,只是刷新页面,所以这个共用的组件是不能够缓存的,不然会造成点其他的条目都是之前缓存的数据。那要怎么自定义呢,那就要在router-view里面多加个v-if判断了,然后在router定义的文件里面在想要缓存的页面多加上“meta:{keepAlive:true}”,不想要缓存就是“meta:{keepAlive:false}”或者不写,只有为true的时候是会被keep-alive识别然后缓存的。

<template>
  <div id="app">
    <!--缓存想要缓存的页面,实现后退不刷新-->
    <!--加上v-if的判断,可以自定义想要缓存的组件,自定义在router里面-->
    <keep-alive>
      <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>
    
    <!--这里是其他的代码-->
  </div>
</template>

3、在router文件加上meta判断

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)
export default new Router({
    {//home会被缓存
        path:"/home",
        component:home,
        meta:{keepAlive: true}
    }
    {//hello不会被缓存
        path:"/hello",
        component:hello,
        meta:{keepAlive: false}
    }
})

想要看有没有缓存成功,可以在各个组件的created钩子里面打印输出标志,缓存成功就是首次进入页面,created会请求数据,后面就不会再次请求而是直接调用缓存的

添加了缓存可以大大减少对系统性能的损坏,毕竟做数据处理型的系统,数据过于庞大,每次都要请求一下页面是很不好的,有了缓存,该缓存的缓存,不想缓存也可以实时刷新

### Vue 3 中 `keep-alive` 组件缓存的取出方法 在 Vue 3 中,`<keep-alive>` 组件的核心功能仍然是通过缓存组件的状态来优化性能[^3]。然而,在某些情况下可能需要手动访问这些缓存的内容或者清除特定的缓存。 #### 使用 `getCacheEntriesByComponent` 获取缓存条目 Vue 3 提供了一个内部 API 来获取 `<keep-alive>` 缓存的具体信息。可以通过 `getCurrentInstance()` 函数结合 `internalApi.getCacheEntriesByComponent(instance)` 访问当前实例下的缓存数据。 以下是具体的代码示例: ```javascript import { getCurrentInstance, onMounted } from 'vue'; export default { setup() { const instance = getCurrentInstance(); onMounted(() => { if (instance && instance.appContext.internalApi) { const cacheEntries = instance.appContext.internalApi.getCacheEntriesByComponent(instance); console.log('Cached components:', cacheEntries); // 输出所有的缓存条目 } }); return {}; }, }; ``` 上述代码展示了如何利用 Vue 3 的内部 API 手动提取由 `<keep-alive>` 管理的缓存条目。 --- #### 清除指定缓存的方法 如果希望主动移除某个已缓存的组件实例,则可以借助 `max` 或者自定义逻辑配合 Vuex/Pinia 实现动态管理缓存策略。下面是一个基于数组形式的例子: ```html <template> <div> <!-- 动态 include --> <keep-alive :include="cachedComponents"> <component :is="currentComponent" /> </keep-alive> <button @click="clearCache">Clear Cache</button> </div> </template> <script> export default { data() { return { currentComponent: 'ComponentA', cachedComponents: ['ComponentA', 'ComponentB'], }; }, methods: { clearCache() { this.cachedComponents = []; // 移除所有缓存 }, }, }; </script> ``` 此示例演示了如何通过修改 `include` 列表的方式间接删除缓存[^2]。 --- #### 结合编程方式操作缓存 对于更复杂的需求,比如按需加载并清理单个组件的缓存,可采用如下方案: ```javascript // 假设有一个名为 MyComponent.vue 的子组件 this.$refs.keepAlive.cache.delete('MyComponent'); // 删除指定组件的缓存 ``` 注意:这种方式依赖于 `$refs` 对象指向实际的 `<keep-alive>` 节点,并且该节点具有公开的 `cache` Map 属性[^4]。 --- ### 注意事项 1. **API 不稳定性**:部分涉及内部实现的功能可能会随着版本更新而改变。 2. **兼容性问题**:确保项目使用的 Vue 版本支持所调用的相关接口。 3. **最佳实践**:除非必要,建议优先使用声明式的配置(如 `include/exclude`),而非直接干预底层机制---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值