全网最细!Vue3实现路由缓存~

news/2024/7/7 21:13:42

1、设置缓存对应的数据

  1. 需要在全局状态管理中,或者当前组件中添加数据(本次演示在全局状态管理中,使用的是 pinia)

    const coreStore = defineStore('coreStore', {
        state () {
            return {
                // 缓存页面路由数组及组件
                cacheRoutes: [],
                includeComs: [],
                cacheComs: new Map()
            }
        },
        actions: {
            setCacheRoute (route: { fullPath: string, name: string }): void {
                this.cacheRoutes.push(route)
            }
        },
    })
    
  2. 在根组件 App.vue 中引入进来

    const store = costore();
    const { cacheRoutes, includeComs, cacheComs } = store
    

2、路由生命周期设置

在 App.vue 组件中,需要设置路由进入前的守卫函数,用于将对应组件进行缓存:

import { useRoute, useRouter } from "vue-router";

const route = useRoute();
const router = useRouter();

router.beforeEach((to, from, next) => {
    // 1 判断内部是否已有改缓存页面
    const bol = cacheRoutes.some(v => v.fullPath === to.fullPath)
    // 2 如果不存在,则存进缓存标签数组中
    !bol && cacheRoutes.push({ fullPath: to.fullPath, name: to.meta.title })
    // 3 缓存组件对应的路由名称
    !includeComs.includes(to.fullPath) && includeComs.push(to.fullPath);
    next()
})

3、将路由组件进行缓存

这个是 Vue3 的写法,不适用与 Vue2

<router-view v-slot="{ Component }">
    <keep-alive :include="includeComs" style="margin-left: 16px;">
        <component :is="formatComponentInstance(Component, $route)" :key="$route.fullPath" />
    </keep-alive>
</router-view>

4、formatComponentInstance

这是最重要的一个函数,因为缓存组件的时候 keep-alive 会根据组件名称进行缓存,假设现在有个 A.vue 组件(名称为 A,如果不使用选项式写法,Vue3默认将组件名称作为组件的 name)

在访问 A?a=1A?a=2 两个路径的时候,会导致访问的都是已缓存的组件,不会重新进行挂载渲染

因此需要该函数保证不同路径下,即使组件相同,也能进行重新挂载和缓存

import { compile, h, nextTick, onMounted, ref, watch } from "vue";

// 显示组件时,替换组件 name,解决同个组件路由不一致问题
const formatComponentInstance = (component, route) => {
    let wrapper;
    if (component) {
        const wrapperName = route.fullPath
        if (cacheComs.has(wrapperName)) {
            wrapper = cacheComs.get(wrapperName);
        } else {
            wrapper = {
                name: wrapperName,
                render() {
                    return h(component);
                },
            }
            cacheComs.set(wrapperName, wrapper);
        }
    }
    return h(wrapper);
}

http://lihuaxi.xjx100.cn/news/1834981.html

相关文章

<JavaEE> Java中线程有多少种状态(State)?状态之间的关系有什么关系?

目录 一、系统内核中的线程状态 二、Java中的线程状态 一、系统内核中的线程状态 状态说明就绪状态线程已经准备就绪&#xff0c;随时可以接受CPU的调度。阻塞状态线程处于阻塞等待&#xff0c;暂时无法在CPU中执行。 二、Java中的线程状态 相比于系统内核&#xff0c;Java…

多维代码特征提取技术浅析

最近我把《代码审计 C/C实践》一书中关于描述SCA工具的技术点之一——多维代码特征提取技术重新阅读了一下&#xff0c;理解一下多维代码特征提取技术以及在SCA工具中的运用。 SCA工具需要对知识库&#xff08;或称为源库我认为更合适&#xff09;中的软件代码提取特征值&…

STM32-SPI3控制MCP3201、MCP3202(Sigma-Delta-ADC芯片)

STM32-SPI3控制MCP3201、MCP3202&#xff08;Sigma-Delta-ADC芯片&#xff09; 原理图手册说明功能方框图引脚功能数字输出编码与实值的转换分辨率设置与LSB最小和最大输出代码&#xff08;注&#xff09; 正负符号寄存器位MSB数字输出编码数据转换的LSB值 将设备输出编码转换为…

C语言--利用选择法对数组中的10个整数按由小到大排序

一.选择法排序介绍&#x1f357; 所谓选择法就是先将10个数中最小的数字与arr[0]交换&#xff0c;再将arr[1]-arr[9]中最小的数字与arr[1]进行交换....每一次比较&#xff0c;找出一个未经排序的数中最小的一个。总共比较9轮。 下面以5个数字为例说明选择法的步骤。 二.完整代码…

奇怪的问题 a==1 a==2 a==3

a 1 && a 2 && a 3 题目很简单&#xff0c;只要让if语句中的判断条件成立即可。 if (a 1 && a 2 && a 3) {console.log(win!!!); }首先分析题目&#xff0c;题目的意思只要我们能够让a同时与1,2,3相等的话&#xff0c;那么此时就成功了…

leetcode算法之链表

目录 1.两数相加2.两两交换链表中的节点3.重排链表4.合并K个升序链表5.K个一组翻转链表 1.两数相加 两数相加 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(…

Swagger在php和java项目中的应用

Swagger在php和java项目中的应用 Swagger简介Swagger在java项目中的应用步骤常用注解 Swagger在php项目中的应用 Swagger简介 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 总体目标是使客户端和文件系统作为服务器以…

并行与分布式计算 第六章 云计算

文章目录 并行与分布式计算 第六章 云计算6.1 什么是云计算6.2虚拟化技术 并行与分布式计算 第六章 云计算 6.1 什么是云计算 云计算是通过互联网&#xff08;“云”&#xff09;提供计算服务&#xff08;包括服务器、存储、数据库、网络、软件、分析和智能&#xff09;你只需…