解决vue单页面 回退页面 keeplive 缓存问题

 更新时间:2020年07月22日 10:56:13   作者:去他喵呜  
这篇文章主要介绍了解决vue单页面 回退页面 keeplive 缓存问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

场景:项目中遇到 vue 点击回退 从A页跳到B页,缓存A页,当B页状态修改再次返回A时,A页查询条件缓存不刷新,列表刷新

A页:

B页:

解决方法:

利用keep-alive 缓存需要缓存的页面

1.在app.vue中改写router-view

<template>
 <div id="app">
   <keep-alive>
    <router-view v-if="$route.meta.keepAlive">
      <!-- 这里是会被缓存的视图组件,比如 page1,page2 -->
    </router-view>
  </keep-alive>
  <router-view v-if="!$route.meta.keepAlive">
    <!-- 这里是不被缓存的视图组件,比如 page3 -->
  </router-view>
 </div>
</template>

2.在router/index.js中添加路由元信息,设置需要缓存的页面

keepAlive:设置需要缓存的页面

isBack:通过beforeRouteEnter这个钩子函数中的from参数判断是从哪个页面过来的,这个参数执行时,组件实例还没创建,不能在data中定义变量。所以我们可以在路由中定义一个变量isBack,用来判断。

{
  path: '/trade',
  name: 'trade',
  component: () => import( /* webpackChunkName: "about" */ '@/views/trade.vue'),
  meta: {
   title:'trade.tradeTitle',
   keepAlive: true, // 此组件需要被缓存
   isBack:false, //用于判断上一个页面是哪个
  }
 },
 {
  path: '/detail/:id',
  name: 'detail',
  component: () => import( /* webpackChunkName: "about" */ '@/views/detail.vue'),
  meta: {
   title:'trade.detailTitle',
   keepAlive: false,
   isBack:false,//用于判断上一个页面是哪个
  }
 },

钩子函数的执行顺序:

不使用keep-alive

beforeRouteEnter --> created --> mounted --> destroyed

使用keep-alive

beforeRouteEnter --> created --> mounted --> activated --> deactivated

再次进入缓存的页面,只会触发beforeRouteEnter -->activated --> deactivated 。created和mounted不会再执行。我们可以利用不同的钩子函数,做不同的事。务必理解上述钩子函数的执行时机和执行顺序,本教程的核心就依赖于此钩子函数

activated和deactivated是使用keep-alive后,vue中比较重要的两个钩子函数,建议详细了解下。

在A页面中通过beforeRouteEnter这个钩子函数中判断是从哪个页面过来的

 beforeRouteLeave(to, from, next) {
 // 路由导航钩子,此时还不能获取组件实例 `this`,所以无法在data中定义变量(利用vm除外)
   // 参考 https://router.vuejs.org/zh-cn/advanced/navigation-guards.html
   // 所以,利用路由元信息中的meta字段设置变量,方便在各个位置获取。这就是为什么在meta中定义isBack
   // 参考 https://router.vuejs.org/zh-cn/advanced/meta.html
  if (from.path === '/detail'){
   //判断是从哪个路由过来的,
    //如果是B页面即detail页面过来的,表明当前页面不需要刷新获取新数据,直接用之前缓存的数据即可
   to.meta.isBack = true;
  }else{
   to.meta.isBack = false;
  }
  next();
 },

data中定义变量isFirstEnter用来判断是否第一次进入,或是否刷新了页面,默认false

 data() {
  return {
   isFirstEnter:false,
  };
 },

created中把isFirstEnter变为true,说明是第一次进入或刷新了页面

 created() {
   this.isFirstEnter=true;
   // 只有第一次进入或者刷新页面后才会执行此钩子函数
   // 使用keep-alive后(2+次)进入不会再执行此钩子函数
   this.$nextTick(() => {
   this.getLists();
  });
 },

activated中增加判断条件

activated() {
  if(this.$route.meta.isBack || !this.isFirstEnter){
   // 如果isBack是false,表明需要获取新数据,否则就不再请求,直接使用缓存的数据
   // 如果isFirstEnter是true,表明是第一次进入此页面或用户刷新了页面,需获取新数据
   this.tradeList=[]
   this.AjaxList = []   //把数据清空,可以稍微避免让用户看到之前缓存的数据
   this.pageNum = 1;
   this.$nextTick(() => {
    this.getLists();
   });
  }else{
   this.$route.meta.isBack=false
   this.isFirstEnter=false;
  }
},

以上这篇解决vue单页面 回退页面 keeplive 缓存问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 在vue3中使用icon图标的三种方案

    在vue3中使用icon图标的三种方案

    这篇文章主要介绍了三种使用icon的方案,分别是element-icon、svg-icon、@iconify/vue,三种方案通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 详解为element-ui的Select和Cascader添加弹层底部操作按钮

    详解为element-ui的Select和Cascader添加弹层底部操作按钮

    这篇文章主要介绍了详解为element-ui的Select和Cascader添加弹层底部操作按钮,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • vue-cli 为项目设置别名的方法

    vue-cli 为项目设置别名的方法

    这篇文章主要介绍了vue-cli 为项目设置别名的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • vue router导航守卫(router.beforeEach())的使用详解

    vue router导航守卫(router.beforeEach())的使用详解

    导航守卫主要用来通过跳转或取消的方式守卫导航。这篇文章主要介绍了vue-router导航守卫(router.beforeEach())的使用,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Vue3的10种组件通信方式总结

    Vue3的10种组件通信方式总结

    组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,这篇文章主要给大家介绍了关于Vue3的10种组件通信方式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • Vue项目实现简单的权限控制管理功能

    Vue项目实现简单的权限控制管理功能

    这篇文章主要介绍了Vue项目实现简单的权限控制功能,文中给大家介绍了两种方式进行权限限制,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2019-07-07
  • element 实现导航栏收起展开功能及思路

    element 实现导航栏收起展开功能及思路

    这篇文章主要介绍了element 实现导航栏收起展开功能,实现思路先给 el-menu加上 :collapse="isCollapse" 属性,这个属性也是 element 上的一个参数,意思为是否开启折叠动画,在 data 中定义 isCollapse ,用 true 和 false 控制展开与收起,需要的朋友可以参考下
    2023-01-01
  • Vue3+TypeScript封装axios并进行请求调用的实现

    Vue3+TypeScript封装axios并进行请求调用的实现

    这篇文章主要介绍了Vue3+TypeScript封装axios并进行请求调用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Element-ui Dialog对话框基本使用

    Element-ui Dialog对话框基本使用

    这篇文章主要为大家介绍了Element-ui Dialog对话框基本使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • vue更新数据却不渲染页面的解决

    vue更新数据却不渲染页面的解决

    这篇文章主要介绍了vue更新数据却不渲染页面的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论