当前位置: 首页 > news >正文

vue3中如何缓存路由组件

在 Vue3 中缓存路由组件,主要借助<keep-alive>组件来实现,具体方法如下:

1. 全局缓存路由组件

在 App.vue 等根组件中,直接将<router-view>包裹在<keep-alive>标签内,这样所有的路由组件都会被缓存。

<template>
  <keep-alive>
    <router-view></router-view>
  </keep-alive>
</template>

2. 缓存特定路由组件

如果只想缓存部分路由组件,可通过<keep-alive>includeexclude属性来控制。

  • 使用include缓存指定组件include接受字符串或正则表达式,代表需要缓存的组件名称。
    首先,确保每个需要缓存的路由组件都设置了name属性 ,如在Home.vue中:
    <template>
      <!-- 组件内容 -->
    </template>
    
    <script setup>
    import { defineComponent } from 'vue';
    export default defineComponent({
      name: 'Home' // 设置组件名称
    });
    </script>

    然后,在根组件中使用keep-alive并配置include

    <template>
      <keep-alive :include="['Home', 'About']"> 
        <router-view></router-view>
      </keep-alive>
    </template>

    这样只有HomeAbout这两个路由组件会被缓存。

  • 使用exclude排除不缓存的组件:例如,希望除了Login组件外其他都缓存,可如下设置:
    <template>
      <keep-alive :exclude="['Login']"> 
        <router-view></router-view>
      </keep-alive>
    </template>

3. 结合路由元信息(meta)动态控制缓存

在路由配置文件(如router.js)中,利用meta字段添加自定义属性,标识该路由组件是否需要缓存。

import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/',
      name: 'Home',
      component: () => import('@/views/Home.vue'),
      meta: { keepAlive: true } // 标识该页面需要缓存
    },
    {
      path: '/about',
      name: 'About',
      component: () => import('@/views/About.vue'),
      meta: { keepAlive: false } // 标识该页面不需要缓存
    }
  ]
});

export default router;

在根组件中,根据meta中的keepAlive属性值动态决定是否使用keep-alive包裹:

<template>
  <router-view v-slot="{ Component, route }">
    <keep-alive v-if="route.meta.keepAlive">
      <component :is="Component"></component>
    </keep-alive>
    <component :is="Component" v-else></component>
  </router-view>
</template>

4. 处理缓存组件的生命周期

使用keep-alive缓存的组件,mountedunmounted钩子函数不会被调用,取而代之的是activated(组件被激活时调用)和deactivated(组件失活被缓存时调用) 。例如,在需要缓存的组件中:

import { onActivated, onDeactivated } from 'vue';

onActivated(() => {
  // 组件被激活时执行,如重新获取数据等
});

onDeactivated(() => {
  // 组件被缓存时执行,如清理定时器等
});

5. 处理动态路由参数变化

当路由参数发生变化(例如/user/1切换到/user/2),默认缓存的组件不会重新渲染。可以通过监听$route对象的变化来手动更新组件:

import { useRoute, watch } from 'vue-router';
const route = useRoute();
watch(
  () => route.params,
  (newParams, oldParams) => {
    // 路由参数变化时执行,如重新请求数据
  },
  { immediate: true }
);

6. 管理缓存状态(可选)

  • 限制缓存数量:避免缓存过多页面导致内存占用过高,可以设置最大缓存数量,当超过时,清理掉最早的缓存。例如结合watchref来实现:
    import { ref, watch } from 'vue';
    const cachedViews = ref([]);
    const MAX_CACHE = 10; // 最大缓存数量
    watch(cachedViews, (val) => {
      if (val.length > MAX_CACHE) {
        cachedViews.value = val.slice(-MAX_CACHE);
      }
    });
  • 缓存状态持久化:使用localStorage等存储方式保存缓存状态,在应用重启时恢复之前的缓存。
    import { onMounted, watch } from 'vue';
    const cachedViews = ref([]);
    onMounted(() => {
      const saved = localStorage.getItem('cachedViews');
      if (saved) {
        cachedViews.value = JSON.parse(saved);
      }
    });
    watch(cachedViews, (val) => {
      localStorage.setItem('cachedViews', JSON.stringify(val));
    });

相关文章:

  • 【QA】装饰模式在Qt中有哪些运用?
  • Python 用户账户(让用户能够输入数据)
  • 【如何打包docker大镜像】
  • NAT和VPN的联系
  • C语言数据结构:栈的操作实现
  • 【从零开始学习计算机科学】软件测试(十)嵌入式系统测试、游戏开发与测试过程、移动应用软件测试 与 云应用软件测试
  • 星越L_灯光操作使用讲解
  • ROS2与OpenAI Gym集成指南:从安装到自定义环境与强化学习训练
  • 力扣22.括号生成
  • 【鸿蒙开发】Hi3861学习笔记- NFC
  • DigitalFoto公司如何用日事清流程管理工具实现任务优先级与状态可视化?
  • css-in-js
  • PyTorch深度学习框架60天进阶学习计划 - 第28天:多模态模型实践(二)
  • 七天免登录 为什么不能用seesion,客户端的http请求自动携带cookei的机制(比较重要)涉及HTTP规范
  • 应用权限组列表
  • 深入理解MySQL日志机制
  • 23种设计模式-抽象工厂(Abstract Factory)设计模式
  • Linux下oa项目部署
  • Selenium工作原理详解
  • # [RPA] 使用八爪鱼进行高效网页数据采集
  • 2025上海车展 | 当智驾不再让人兴奋,汽车智能化暗战升级
  • 伊朗内政部长:港口爆炸由于“疏忽”和未遵守安全规定造成
  • 一回合摘下“狮心”,张名扬霸气回应观众:再嘘一个我听听
  • 人民日报读者点题:规范涉企执法,怎样防止问题反弹、提振企业信心?
  • 《深化养老服务改革发展的大湾区探索》新书将于今年6月出版
  • 航天科技集团质量技术部部长严泽想升任集团副总经理