vue如何实现路由缓存

(以下示例皆是以vue3+vite+ts项目为例)

场景一:所有路由都可以进行缓存

在渲染路由视图对应的页面进行缓存设置,代码如下:

html 复制代码
<template>
  <router-view v-slot="{ Component, route }">
    <transition name="router-fade" mode="out-in">
      <keep-alive>
        <component :is="Component" :key="route.fullPath" />
      </keep-alive>
    </transition>
  </router-view>
</template>

<router-view>:用来渲染当前路由对应的视图。

  • v-slot :解构 router-view 的插槽属性来访问当前路由的组件(Component)和路由对象(route)。

<transition>:用于实现页面路由切换时的过渡动画效果,可省略。

  • name="router-fade":定义过渡动画类名为router-fade,如router-fade-enter-active
  • mode="out-in":设置过渡模式为先出后进,即新组件先渲染,旧组件再离开

切记:虽然vue3支持一个组件中有多个根节点,但是<transition>不支持多个根节点,否者页面无法正确显示,例如:打开缓存过的页面会出现白屏现象。

<keep-alive>:用来缓存路由组件。

<component>:用来动态渲染组件。

  • :is="Component":表示要渲染的组件由 Component 变量决定。
  • :key="route.fullPath":为组件添加唯一的键值,确保路由发生变化时触发组件的重新渲染。

场景二:动态设置可以缓存的路由

  1. 在router中配置keepAlive,设置支持缓存的页面,例如
javascript 复制代码
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import Layout from '../views/layout/index.vue';
const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'Layout',
    component: Layout,
    meta:{
      keepAlive:true //支持缓存
    }
  },
  {
    path: '/about',
    name: 'About',
    component: () => import("../views/about/index.vue"),
    meta:{
      keepAlive:false //不支持缓存
    }
  },
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

export default router;
  1. 在支持缓存的对应页面中设置name ,此name必须于路由中设置的name一致。
javascript 复制代码
<script setup lang="ts">
// 使用 defineOptions 设置组件的 name 属性
defineOptions({
  name: 'Layout'
});
</script>

3.在渲染路由视图对应的页面进行缓存设置,代码如下:

(相比场景一,多了:include="cachedViews"的设置)

javascript 复制代码
<template>
  <router-view v-slot="{ Component, route }">
    <transition name="router-fade" mode="out-in">
      <keep-alive :include="cachedViews">
        <component :is="Component" :key="route.fullPath" />
      </keep-alive>
    </transition>
  </router-view>
</template>
<script setup lang="ts">
import {ref,watchEffect} from "vue";
import { useRoute } from 'vue-router';
// 定义缓存的视图数组
const cachedViews=ref<string[]>([])
const route = useRoute();
// 监听路由变化
watchEffect(() => {
  const name = route.name as string;
  if (route.meta.keepAlive) {
    if (!cachedViews.value.includes(name)) cachedViews.value.push(name);
  } else {
    const index = cachedViews.value.indexOf(name);
    if (index > -1)cachedViews.value.splice(index, 1);
  }
});
</script>
相关推荐
这是个栗子17 小时前
【Vue代码分析】前端动态路由传参与可选参数标记:实现“添加/查看”模式的灵活路由配置
前端·javascript·vue.js
刘一说18 小时前
Vue 动态路由参数丢失问题详解:为什么 `:id` 拿不到值?
前端·javascript·vue.js
熊猫钓鱼>_>18 小时前
动态网站发布部署核心问题详解
前端·nginx·容器化·网页开发·云服务器·静态部署
方也_arkling18 小时前
elementPlus按需导入配置
前端·javascript·vue.js
xxxmine18 小时前
Redis 持久化详解:RDB、AOF 与混合模式
数据库·redis·缓存
我的xiaodoujiao18 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 44--将自动化测试结果自动推送至钉钉工作群聊
前端·python·测试工具·ui·pytest
沛沛老爹18 小时前
Web开发者转型AI:多模态Agent视频分析技能开发实战
前端·人工智能·音视频
David凉宸18 小时前
vue2与vue3的差异在哪里?
前端·javascript·vue.js
笔画人生19 小时前
Cursor + 蓝耘API:用自然语言完成全栈项目开发
前端·后端
AC赳赳老秦19 小时前
外文文献精读:DeepSeek翻译并解析顶会论文核心技术要点
前端·flutter·zookeeper·自动化·rabbitmq·prometheus·deepseek