组件缓存 keep-alive

组件缓存的目的:(一般在项目优化这步骤完成) 

  • 防止组件频繁创建和销毁
  • 防止网络请求重复无用执行

步骤

组件缓存, 可以实现组件的状态保持。

结合 vue 内置的 keep-alive 组件,可以实现组件的状态保持。

官方文档地址:https://cn.vuejs.org/v2/api/#keep-alive

  1. App.vue中的router-view外层套上一个keep-alive组件

    • 缓存的一级路由页面切换不被释放, 但是首页还是会重新请求数据(因为首页在二级路由中)
  2. Layout.vue中的router-view外层套上一个keep-alive组件

    • 这次Home和My页面都被缓存了(二级路由也要管)
  3. 但发现搜索页面(一级路由下)详情页面(一级路由下)多被缓存起来了 (多次进入不同的文章, 发现都是同一个文章详情)

  4. 对router-view使用exclude属性来区别, 哪些页面组件可以缓存

    ==特别注意exclude里是组件的name名字(跟路由没什么关系)==

    <template>
      <div id="app">
        <!-- 一级路由窗口 -->
        <keep-alive
          exclude="ArticleIndex,search,UserProfile,favoriteArticle,HistoryAticle,fens"
        >
          <router-view></router-view>
        </keep-alive>
      </div>
    </template>

    当然你也可以在二级路由上设置exclude

<template>
  <div class="layout-container">
    <!-- 二级路由出口 -->
    <keep-alive exclude="my">
      <router-view> </router-view>
    </keep-alive>
  </div>
</template>
<script>

小结

  • 只有被切换销毁的组件, 才需要被缓存
  • router-view是他们切换时的挂载点, 套在挂载点外来缓存内部组件

 注意点:

组件被缓存,切走了就会失去激活生命周期方法触发 deactivated

  无被缓存,切走了,destroyed摧毁生命周期方法触发

### Vue 3 中 `keep-alive` 组件的使用 在 Vue 3 中,`<keep-alive>` 组件提供了一种方式来缓存动态组件的状态,从而提高应用性能。这使得当用户在不同视图间切换时,之前加载过的组件不会被销毁而是保存其状态。 #### 基本语法结构 为了使 `<keep-alive>` 生效,需将其作为父级容器包裹住要缓存的目标组件: ```html <template> <div id="app"> <!-- 使用 include 和 exclude 来指定哪些组件应该被缓存 --> <keep-alive :include="['ComponentA', 'ComponentB']" :exclude="['ComponentC']"> <component v-bind:is="currentView"></component> </keep-alive> </div> </template> <script setup> import { ref } from 'vue' const currentView = ref('ComponentA') </script> ``` 此代码片段展示了如何通过设置 `include` 或者 `exclude` 属性来自定义需要缓存的具体组件名称[^2]。 #### 动态组件与 key 控制 对于更加复杂的场景,可以通过给内部使用的 `<component>` 添加唯一的 `key` 属性来进行更细粒度上的控制。每当这个键值发生变化的时候,即使目标组件相同也会触发新的实例化过程而非重用旧有的缓存版本: ```html <template> <keep-alive> <component :is="viewName" :key="uniqueKey"></component> </keep-alive> </template> <script setup> // 示例省略具体逻辑... let uniqueKey = computed(() => /* 计算得出唯一标识 */); </script> ``` 这种方法特别适用于那些依赖外部数据源更新显示内容的情况,在每次获取到最新信息之后改变一次 `key` 就能强制刷新对应部分而不影响其他已缓存的内容[^3]。 #### 利用生命周期钩子增强功能 除了上述方法外,还可以监听由 `<keep-alive>` 提供的一些特殊事件(如 activated / deactivated),以便执行额外的操作比如清理定时器、取消网络请求等资源释放工作;也可以用来做页面离开前的数据持久化操作等等。 ```javascript export default { name: "MyComponent", activated() { console.log("The component is now visible and active."); }, deactivated() { console.log("The component has been hidden or replaced."); } }; ``` 这些钩子函数可以帮助开发者更好地管理组件在整个生命周期内的行为变化,确保最佳用户体验的同时也维护良好的内存管理和性能表现[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值