keep-alive多级页面缓存实现

文章目录

    • keep-alive多级页面缓存实现
        • 只适用于页面是否缓存状态不变的情况
        • 对于上面的问题提供一种解决方案

keep-alive多级页面缓存实现

只适用于页面是否缓存状态不变的情况

网上有一种很普遍的教程,不使用keep-aliveinclude属性,而是通过在路由表中添加meta: { keepAlive: true},通过v-if判断是否使用keep-alive

<keep-alive>
   <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>

这种写法只适用于页面是否缓存的状态不变的情况

现实中遇到的场景是,有三个页面(总览页、列表页、详情页),三个页面逐级跳转(总览页 -> 列表页 -> 详情页)。因为列表页是分页懒加载的,用户希望可以从详情页返回时可以直接定位到之前的位置

因此要实现的实际上为页面缓存+记录滚动条位置,这里先看页面缓存

网上很多教程的写法是,在列表页使用beforeRouteLeave,动态设置keepAlive的值

// 列表页
beforeRouteLeave(to, from, next) {
  if (to.name === "详情页") {
    from.meta.keepAlive = true; 
  } else {
    from.meta.keepAlive = false;
    this.$destroy();
  }
  next();
},

乍一看没什么问题,到详情页的时候将keepAlive设为true进行缓存,返回到总览页的时候设置为false取消缓存,但仔细想一下,这样写是晚一步的,是否缓存在刚进入页面时就定下来了,在beforeRouteLeave的时候修改keepAlive,相当于修改的是下次进入页面时是否缓存

实际流程会变为

理想状态下
总览页		此时列表页路由的keepAlive默认为true	点击进入列表页
列表页		点击进入详情页		此时会缓存列表页,keepAlive仍为true
详情页		返回列表页	 获取缓存
这部分流程没有问题,接下来
列表页		返回总览页 	列表页被销毁,keepAlive变为false
总览页		点击进入列表页 	列表页keepAlive为false
这次列表页将不会被缓存,此时已经出现问题

那我们是不是可以不设置from.meta.keepAlive = false;,只在返回时销毁keep-alive的缓存,此时又出现了一个新的问题,在使用this.$destroy();销毁组件后会导致缓存异常(回退时不使用缓存的列表页,而是创建了个新的,并且会一直缓存)。详情可以百度this.$destroy()导致keep-alive缓存异常

Reference:vue-router时 keep-alive 页面缓存问题解决 - 知乎

调用$destroy后,组件生命周期出现异常。 · Issue #6961 · vuejs/vue · GitHub

所以要实现类似功能,就使用include和exclude,很多帖子纯纯的坑

对于上面的问题提供一种解决方案

还是对需要缓存的路由添加meta: { keepAlive: true}

维护一个页面栈,将访问过的页面添加进去,如果当前进入的页面在之前访问过,代表是回退操作,则将页面栈中在本页面之后的数据删除,使用include记得要给组件添加name

<template>
  <div id="app">
    <keep-alive :include="cachePageList">
      <router-view></router-view>
    </keep-alive>
  </div>
</template>
<script>
 export default {
   data(){
     return {
       pageRouteList: [] // 访问过的页面栈
     }
   },
   computed: {
     cachePageList(){
       // 缓存只取页面栈中router设置了keepAlive的
      return this.pageRouteList.filter(route => route.meta.keepAlive).map(route => route.name)
     }
   },
   watch: {
     $route(to, from) {
       const index = this.pageRouteList.findIndex(route => route.fullPath === to.fullPath)
       const isVisited = index !== -1
       if (!isVisited) {
        this.pageRouteList.push(to)
      } else {
        this.pageRouteList.splice(index + 1)
      }
     }
   }
 }
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917690.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024-11-16-机器学习方法:无监督学习(1) 聚类(上)

文章目录 机器学习方法&#xff1a;无监督学习&#xff08;1&#xff09; 聚类&#xff08;上&#xff09;1. 聚类的基本概念1.1 聚类的概念1.2 聚类的功能1.3 聚类的算法 2. 相似度或距离2.1 闵可夫斯基距离2.2 相关系数2.3 夹角余弦 3 类或簇3.1 类的特征 4 类与类之间的距离…

Vue-组件三大组成组件通信

一、学习目标 1.组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09; scoped解决样式冲突/data是一个函数 2.组件通信 组件通信语法 父传子 子传父 非父子通信&#xff08;扩展&#xff09; 3.综合案例&#xff1a;小黑记事本&#xff08;组件版&#xff09; 拆…

Scratch 014生日贺卡(上)

知识回顾&#xff1a; 1、“面向鼠标指针”积木块 2、“重复执行直到”积木块 本次分享制作生日贺卡引入广播模块 案列效果&#xff1a; 生日贺卡上案例效果-CSDN直播 步骤拆解&#xff1a; 1、添加背景和角色 2、编辑贺卡造型添加名字 3、流程图的组成和画法 4、…

MySQL中将一个字符串字段按层级树状展开

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 需求1.分析2.实现3.思路刨析表结构和数据 需求 数据库中有个字段如下 如何将其转换为如下形式&#xff1a; 1.分析 1.他的层级个数是不确定的&#xff0c;也就是说有的有2层有的有5…

hive搭建

1.准备环境 三台节点主机已安装hadoopmysql数据库 2.环境 2.1修改三台节点上hadoop的core-site.xml <!-- 配置 HDFS 允许代理任何主机和组 --> <property><name>hadoop.proxyuser.hadoop.hosts</name><value>*</value> </property&…

创建vue+electron项目流程

一个vue3和electron最基本的环境搭建步骤如下&#xff1a;// 安装 vite vue3 vite-plugin-vue-setup-extend less normalize.css mitt pinia vue-router npm create vuelatest npm i vite-plugin-vue-setup-extend -D npm i less -D npm i normalize.css -S &#xff0…

Pyhon基础数据结构(列表)【蓝桥杯】

a [1,2,3,4,5] a.reverse() print("a ",a) a.reverse() print("a ",a)# 列表 列表&#xff08;list&#xff09;有由一系列按照特定顺序排序的元素组成 列表是有顺序的&#xff0c;访问任何元素需要通过“下标访问” 所谓“下标”就是指元素在列表从左…

帽子矩阵--记录

帽子矩阵&#xff08;Hat Matrix&#xff09;并不是由某一位具体的科学家单独发明的&#xff0c;而是逐渐在统计学和线性代数的发展过程中形成的。帽子矩阵的概念最早出现在20世纪初的统计学文献中&#xff0c;尤其是在回归分析的研究中得到了广泛应用。然而&#xff0c;具体是…

一.安装版本为19c的Oracle数据库管理系统(Oracle系列)

1.数据库版本信息&#xff1a; 版本信息&#xff1a; 或者直接由命令查出来&#xff1a; 2.操作系统的版本信息 3.安装包下载与上传 可以去oracle官网下载也可以从其他人的百度网盘链接中下载&#xff1a; 使用xftp工具或者其他的工具&#xff08;mobaxterm&#xff09;上传到l…

计算机视觉 ---图像模糊

1、图像模糊的作用&#xff1a; 减少噪声&#xff1a; 在图像获取过程中&#xff0c;例如通过相机拍摄或者传感器采集&#xff0c;可能会受到各种因素的干扰&#xff0c;从而引入噪声。这些噪声在图像上表现为一些孤立的、不符合图像主体内容的像素变化&#xff0c;如椒盐噪声&…

关于强化学习的一份介绍

在这篇文章中&#xff0c;我将介绍与强化学习有关的一些东西&#xff0c;具体包括相关概念、k-摇臂机、强化学习的种类等。 一、基本概念 所谓强化学习就是去学习&#xff1a;做什么才能使得数值化的收益信号最大化。学习者不会被告知应该采取什么动作&#xff0c;而是必须通…

嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)

引言&#xff1a;对于嵌入式硬件这个庞大的知识体系而言&#xff0c;太多离散的知识点很容易疏漏&#xff0c;因此对于这些容易忘记甚至不明白的知识点做成一个梳理&#xff0c;供大家参考以及学习&#xff0c;本文主要针对芯片输入接入0.1uf电容的本质的知识点的进行学习。 目…

近几年新笔记本重装系统方法及一些注意事项

新笔记本怎么重装系统&#xff1f; 近几年的新笔记本默认开启了raid on模式或vmd选项&#xff0c;安装过程中会遇到问题&#xff0c;新笔记本电脑重装自带的系统建议采用u盘方式安装&#xff0c;默认新笔记本有bitlocker加密机制&#xff0c;如果采用一键重装系统或硬盘方式安装…

GPIO相关的寄存器(重要)

目录 一、GPIO相关寄存器概述 二、整体介绍 三、详细介绍 1、端口配置低寄存器&#xff08;GPIOx_CRL&#xff09;&#xff08;xA...E&#xff09; 2、端口配置高寄存器&#xff08;GPIOx_CRH&#xff09;&#xff08;xA...E&#xff09; 3、端口输入数据寄存器&#xff…

华为Mate 70临近上市:代理IP与抢购攻略

随着科技的飞速发展&#xff0c;智能手机已经成为我们日常生活中不可或缺的一部分。而在众多智能手机品牌中&#xff0c;华为一直以其卓越的技术和创新力引领着行业的发展。近日&#xff0c;华为Mate 70系列手机的发布会正式定档在11月26日&#xff0c;这一消息引发了众多科技爱…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

随着信息技术的快速发展和数字化时代的到来&#xff0c;安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…

MySQL:表设计

表的设计 从需求中获得类&#xff0c;类对应到数据库中的实体&#xff0c;实体在数据库中表现为一张一张的表&#xff0c;类中的属性就对应着表中的字段&#xff08;也就是表中的列&#xff09; 表设计的三大范式&#xff1a; 在数据库设计中&#xff0c;三大范式&#xff0…

单元测试时报错找不到@SpringBootConfiguration

找到问题出现原因&#xff1a; 错误表示 Spring Boot 在运行测试时无法找到 SpringBootConfiguration 注解。 通常&#xff0c;SpringBootTest注解用于加载 Spring Boot 应用上下文&#xff0c;但它需要找到一个带有SpringBootConfiguration&#xff08;或者Configuration&am…

Python爬虫下载新闻,Flask展现新闻(2)

上篇讲了用Python从新闻网站上下载新闻&#xff0c;本篇讲用Flask展现新闻。关于Flask安装网上好多教程&#xff0c;不赘述。下面主要讲 HTML-Flask-数据 的关系。 简洁版 如图&#xff0c;页面简单&#xff0c;主要显示新闻标题。 分页&#xff0c;使用最简单的分页技术&…

信捷PLC转以太网连接电脑方法

信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程&#xff0c;即插即用&#xff0c;具体看见以下介绍&#xff1a; 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计&#xff0c;可实现工厂设备信息化需求&#xff0c;对…