vue3中RouterView配合KeepAlive实现组件缓存

KeepAlive组件缓存

为什么需要组件缓存

业务需求:一般是列表页面通过路由跳转到详情页,跳转回来时,需要列表页面展示上次展示的内容

代码展示

App.vue入口

javascript 复制代码
<script setup lang="ts">
import { RouterView, RouterLink } from "vue-router"
</script>

<template>
  <div>
    <RouterLink to="/">
      home
    </RouterLink>
    <RouterLink to="/about">
      about
    </RouterLink>
  </div>
  <div>
    <RouterView v-slot="{ Component }">
      // AboutComponent是组件的名称,vue4组件中通过defineOptions定义
      <KeepAlive include="AboutComponent">
        <component :is="Component" />
      </KeepAlive>
    </RouterView>
  </div>
</template>

home.vue组件

javascript 复制代码
<template>
  <div>home</div>
</template>

<script setup lang="ts">
import { onMounted } from "vue"
defineOptions({
  name: "HomeComponent",
})
onMounted(() => {
   console.log("home onMounted")
})
</script>

about.vue组件

javascript 复制代码
<template>
  <div>about</div>
</template>

<script setup lang="ts">
import { onMounted } from "vue"
defineOptions({
  name: "AboutComponent",
})
onMounted(() => {
  console.log("about onMounted")
})
</script>

缓存效果

1、home和about组件首次加载都会执行onMounted生命周期,但是对about组件进行了缓存,再次切换到about组件,就不会重新初始化,就不会执行onMounted生命周期。

2、keepalive使用include和exclude实现缓存的好处是:只要被缓存的组件首次加载之后,无论在缓存组件之间切换,还是缓存组件与未缓存组件之间切换,都不会重新挂载。

为什么不用v-if

网络上经常使用就是如下代码:

javascript 复制代码
<keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view> 

虽然也能实现页面缓存,但是从非缓存组件 切换到缓存组件 时,会重新挂载缓存组件 ,从而再次执行onMounted生命周期,只有在两个同样是缓存的组件之间切换才会有实际的缓存效果

相关推荐
@大迁世界8 小时前
Firefox 本地模式:localhost 再见了 ?
前端·架构
米米商聊10 小时前
同名附件为什么被 Map 覆盖?重复键与一对多索引
前端·javascript
echome88811 小时前
Python 异常处理:try、else、finally 的正确搭配
开发语言·前端·python·异常处理·编程技巧
时间的情敌11 小时前
OpenLayers 实战|Vue3 + OpenLayers 完整工程案例(加载天地图、要素、弹窗、绘制、WFS)
前端·openlayers
陈随易11 小时前
下载神器!Motrix 停更三年后重写回归
前端·后端·程序员
前端的日常12 小时前
一个人+AI做情侣食谱小程序,0 费用的服务器
前端·后端
计算机魔术师12 小时前
谷歌搜索广告踩刹车,AI广告成为救命稻草
前端
总要学点什么12 小时前
第81篇:数据可视化-PM2.5分布——让圆点的胖瘦替每座城市报出浓度
前端·信息可视化·echarts·cesium·空间分析
IT_陈寒12 小时前
Vue的v-for里用了个临时变量,页面直接挂了
前端·人工智能·后端
hunter_07613 小时前
一次 iOS 真机签名 409 的完整排查:证书、设备、描述文件为什么总是"对不上"
前端