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

vue如何实现路由缓存

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

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

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

<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,设置支持缓存的页面,例如

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;

2. 在支持缓存的对应页面中设置name ,此name必须于路由中设置的name一致。

<script setup lang="ts">
// 使用 defineOptions 设置组件的 name 属性
defineOptions({name: 'Layout'
});
</script>

3.在渲染路由视图对应的页面进行缓存设置,代码如下:
(相比场景一,多了:include="cachedViews"的设置)

<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>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 7.统一网关-Gateway
  • 解决Pynput不能在Ubuntu22.04上正常使用问题
  • 百度飞将 paddle ,实现贝叶斯神经网络 bayesue neure network bnn,aistudio公开项目 复现效果不好
  • Oracle SQL和PL/SQL中SQL%ROWCOUNT和SQL%FOUND属性
  • STM32
  • 【Linux】冯诺依曼概念以及操作系统基础概念
  • Hadoop 下载
  • 集运系统需要与哪些硬件设备集成?
  • QString如何追加字符串
  • 视频安防监控LntonAIServer安防管理平台抖动检测和过亮过暗检测
  • 电工基础知识
  • Mental-LLM——通过在线文本数据利用大型语言模型进行心理健康预测
  • 【路径规划】 使用计算机视觉和机器人操纵器绘制肖像
  • 1-6 图像覆盖掩膜 opencv树莓派4B 入门系列笔记
  • 金融、互联网等领域手机三要素API接口的应用
  • ES6指北【2】—— 箭头函数
  • create-react-app做的留言板
  • css布局,左右固定中间自适应实现
  • IndexedDB
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Lsb图片隐写
  • mysql中InnoDB引擎中页的概念
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • RxJS: 简单入门
  • 回流、重绘及其优化
  • 聊聊directory traversal attack
  • 你真的知道 == 和 equals 的区别吗?
  • 全栈开发——Linux
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 因为阿里,他们成了“杭漂”
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​secrets --- 生成管理密码的安全随机数​
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #数据结构 笔记三
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $.ajax()方法详解
  • $L^p$ 调和函数恒为零
  • (c语言)strcpy函数用法
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二)Linux——Linux常用指令
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (三)模仿学习-Action数据的模仿
  • (学习日记)2024.01.09
  • (转)关于pipe()的详细解析
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net 4.0并行库实用性演练
  • .net 7 上传文件踩坑
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET Framework 3.5安装教程
  • .NET 设计模式—适配器模式(Adapter Pattern)