vue2中页面数据及滚动条缓存

vue2vue3中页面数据及滚动条缓存(步骤以vue2为例,vue3类似):

一、页面数据及滚动条缓存核心代码:

1、在main.js文件中添加如下代码:
js 复制代码
// 用于记录历史记录 实现页面缓存
let history = window.sessionStorage.getItem("history");
if (!history) {
  history = "[]";
}
history = JSON.parse(history);
// 全局前置守卫
router.beforeEach((to, from, next) => {
  // 获取当前历史记录的长度
  const historyLength = history.length;
  // 检查是否是后退操作
  if (historyLength >= 2 && history[historyLength - 2].path === to.path) {
    // 后退操作
    console.log("路由后退");
    // 移除当前路由
    history.pop();
    if (to.meta.pageLevel != history[history.length - 1].pageLevel) {
      to.meta.pageLevel = history[history.length - 1].pageLevel;
    }
    // 设置目标路由是否需要缓存 因方法为全局的所以进行这个判断来限制页面缓存
    if(to.meta.hasOwnProperty("isPageCache")&&to.meta.isPageCache==true){
      // to.meta.keepAlive = true;
      // from.meta.keepAlive = false;
    }
  } else {
    // 前进操作
    console.log("路由前进");
    if (!from.meta.hasOwnProperty("pageLevel")) from.meta.pageLevel = 0;
    //设置路由进入的页面层级数
    to.meta.pageLevel = from.meta.pageLevel + 1;
    // 添加当前路由到历史记录
    if (history.length === 0 || to.path != history[history.length - 1].path) {
      history.push({
        path: to.path,
        pageLevel: to.meta.pageLevel,
        refName: "scrollContainerDiv"
      });
    }
    if (to.meta.pageLevel != history[history.length - 1].pageLevel) {
      to.meta.pageLevel = history[history.length - 1].pageLevel;
    }
  }
  window.sessionStorage.setItem("history", JSON.stringify(history));
  next();
});
1、定义公共的mixins,在utils文件夹下创建mixins文件夹,并在该文件夹下创建myScrollMinxin.js文件,myScrollMinxin.js里的代码如下:
js 复制代码
export default {
  beforeRouteEnter(to, from, next) {
    let refName = to.meta.hasOwnProperty("refName") ? to.meta.refName : "";
    // 可以通过传一个回调给 next 来访问组件实例
    next(vm => {
      // 通过 `vm` 访问组件实例
      if (from.meta.pageLevel <= to.meta.pageLevel) {
        to.meta.scrollTop = 0;
        vm.$nextTick(() => {
          vm.$refs[refName].scrollTop = parseInt(to.meta.scrollTop);
        });
      } else {
        if (to.meta.hasOwnProperty("scrollTop")) {
          vm.$nextTick(() => {
            vm.$refs[refName].scrollTop = parseInt(to.meta.scrollTop);
          });
        }
      }
    });
  },
  beforeRouteLeave(to, from, next) {
    if (to.meta.hasOwnProperty("refName")) {
      let refName = to.meta.refName;
      if (from.meta.hasOwnProperty("scrollTop")) {
        from.meta.scrollTop = this.$refs[refName].scrollTop;
      }
    }
    next();
  }
};

二、页面数据及滚动条缓存调用步骤如下(代码已封装目前只需要按如下步骤调用即可,若新项目需要页面数据及滚动条缓存可将第一步核心代码引入项目,再调用步骤二):

1、在路由router文件夹下的index.js文件中新增自己路由的meta字段添加如下代码:

js 复制代码
   meta: {
      keepAlive: true,
      pageLevel: 0,
      refName: "scrollContainerDiv",
      scrollTop: 0,
    }

2、在需要数据和滚动条缓存的.vue文件中添加如下代码:

vue 复制代码
<template>
   <div>
       //你的代码
       //需要滚动部分
       <div class="my-compont-box" :ref="$route.meta.refName">
           // 1、你的代码没有tab切换的内容 就不需要在
           // 2、你的代码有tab切换的内容;类似如下需要在tab切换事件中添加 this.$refs[this.$route.meta.refName].scrollTop = 0:
           //(1) <component :is="tabComponents[tabIndex]"></component>
           //(2)<组件1 v-if='条件1'></组件1>
           //     <组件2 v-else-if='条件2'></组件2>
           //     ...
       </div>
   </div>
</template>
<script>
//引入封装的 myScrollMinxin.js
import myScrollMinxin from "@/utils/mixins/myScrollMinxin.js";
export default {
    //在 mixins 注入自定义的 myScrollMinxin
    mixins: [myScrollMinxin],
    methods: {
        //2、你的代码有tab切换的内容需要在tab切换事件中添加
        //this.$refs[this.$route.meta.refName].scrollTop = 0
        tabChangeHandler(index){
            this.$refs[this.$route.meta.refName].scrollTop = 0
        }
    }
}
</script>
相关推荐
user20585561518132 分钟前
X6 中边悬浮置顶,规避 `mouseleave` 事件丢失问题
前端
李明卫杭州4 分钟前
CSS aspect-ratio 属性完全指南
前端
Pedantic2 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘2 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆2 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
浏览器工程师3 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
雨季mo浅忆3 小时前
VSCode自动格式化三要素
前端
爱勇宝4 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
kyriewen5 小时前
同事每天催我 Code Review,我写了个脚本让 AI 替我 review PR——现在他反过来催 AI 了
前端·javascript·ai编程