欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

vue路由中前进后退的一些事儿

程序员文章站 2023-12-05 21:38:22
前言 最近蒸煮在做一个独立项目的时候遇到了一个小坑,特此做个爬坑纪念。 基本情景是页面之间通过vue路由跳转,从页面a跳转到页面b(在页面b进行对应操作后),再从页面b...

前言

最近蒸煮在做一个独立项目的时候遇到了一个小坑,特此做个爬坑纪念。

基本情景是页面之间通过vue路由跳转,从页面a跳转到页面b(在页面b进行对应操作后),再从页面b跳转到页面c。之后再从页面c返回到页面b,页面b保留之前状态,返回页面a,页面b状态不保留。(。・∀・)ノ゙嗨~感觉说的好乱。

总之就是,前进刷新,后退不刷新(刷新是指是否重新渲染)

相信很多小伙伴都会想到用keep-alive开启缓存页面来实现,鹅,蒸煮也没例外,下面就是蒸煮的爬坑过程。

vue路由开启keep-alive缓存页面

keep-alive是vue官方提供的一种缓存组件实例的方法。

第一步,先改写<router-view>的展示方式

<keep-alive>
//这是会被缓存的页面
 <router-view v-if="$route.meta.keepalive">
 </router-view></keep-alive>
<router-view v-if = "!$route.meta.keepalive">
//这里是不被缓存的组件
</router-view>

第二步,在路由配置文件里,配置组件是否被缓存

routes:[
 {  path: '/', 
   name: 'index', 
   component: index,  
   meta:{ 
    title:"博物馆",  
    keepalive:false//不缓存 
   } 
   }, 
   { 
   path:'/searchmain', 
   name:'searchmain', 
   component:searchmain, 
   meta:{ 
    title:"搜索", 
    keepalive:true,//缓存 
     } 
   },
   { 
   path:'/collectiondetails', 
   name:'collectiondetails', 
   component:collectiondetails, 
   meta:{  
    title:"藏品详情", 
    keepalive:false,//不缓存 
    } 
   }]

这样的话无论什么时候,缓存的组件一直会被缓存

第三步,根据路由钩子来改变缓存组件的状态

beforerouteleave(to, from, next) { 
  if(to.path="首页"){
   from.meta.keepalive =false;
  }else if(to.path="详情页"){
  from.meta.keepalive = true;
  } // 跳转到 首页时,不缓存,跳转到详情页时缓存(就是不刷新) 
  next();
  }
这种行吗?行吗?行吗?不行!!因为第一次的时候确实会成功,可是退出去以后就gg了,
因为keepalive已经变成了false,第二次就不会缓存。那么第一个页面加下面代码,让他进入的时候
 beforerouteleave(to, from, next) { 
  if(to.path=="/searchmain"){ 
  to.meta.keepalive =true;  
  } 
  next(true); 
 return; 
},

实践证明,搜索界面的数据一直是第一次缓存过的数据。

二,为了解决这个问题,蒸煮想起了keep-alive组件相关的两个钩子函数。

activated:缓存的组件再次进入时触发;

deactivated:缓存的组件离开时会触发;

第一次进入keep-alive组件时,其生命周期执行顺序:

beforerouteenter ->created ->mounted ...->activated ->deactivated

非首次进入时,其生命周期执行顺序

beforerouteenter ->activated ->deactivated

第二次进入的时候vue组件的生命周期函数都没有执行,说明缓存组件也无法销毁。更无法更新。

解决方法

 activated() {
 if(!this.$route.meta.isback) {
  // 如果isback是false,表明需要获取新数据,否则就不再请求,直接使用缓存的数据  this.getdata(); // ajax获取数据方法
 }
 // 恢复成默认的false,避免isback一直是true,导致下次无法获取数据
 this.$route.meta.isback = false
},

但素,重新换取数据,之前保存在data里的数据并没有变,感觉还是不太彻底!

终极解决方案

最后终于到答案的最后一步啦那

就是动态给要缓存的路由组件添加key值啦~

<keep-alive>
   <router-view v-if="$route.meta.keepalive" :key='key'></router-view>
</keep-alive>
   <router-view v-if="!$route.meta.keepalive" :key='key'></router-view>

在vuex中有条件改变key的值

beforerouteleave(to,from,next){
 if(to.path=="/"){
  this.$store.commit("update_key",this.$route.name!==undefined?this.$route.name+
  +new date():this.$route+ +new date());
 }
}

这样的话就会有一个很重要的问题,这些缓存过的组件,都是在内存中的,如果一直操作,内存堆积越来越大,导致系统卡顿。所以离开时就销毁吧

手动触发销毁

beforerouteleave(to,from,next){
 if(to.path=="/"){
  this.$store.commit("update_key",this.$route.name!==undefined?this.$route.name+ +new date():this.$route+ +new date());
     this.$destroy();//销毁吧
}

结语:写完了,希望能够供大家参考哦!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。