博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue路由里前进后退的那些事儿
阅读量:6244 次
发布时间:2019-06-22

本文共 2861 字,大约阅读时间需要 9 分钟。

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

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

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

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

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

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

  • 第一步,先改写<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值啦~

复制代码

在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();//销毁吧}复制代码

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

转载地址:http://wxvia.baihongyu.com/

你可能感兴趣的文章
电信运营商解决方案
查看>>
日本显示屏公司的尴尬:夏普被收购 JDI也岌岌可危
查看>>
[MySQL 5.7]:binlog --statement
查看>>
MicroProfile变成了Eclipse MicroProfile
查看>>
中国电信10G PON演进研究成果卓著:为现网升级铺平道路 加速千兆时代到来
查看>>
家庭宽带市场竞争分析
查看>>
台媒:手机应用和免费wifi可瞬间泄露隐私
查看>>
QUnit单元测试文档
查看>>
手机网络电话(VOIP)大比拼
查看>>
华天动力OA系统全国渠道布局 20个城市分公司初露端倪
查看>>
我市智慧城市建设迈入快车道
查看>>
FSF 鼓励用户抛弃英特尔
查看>>
编程语言漫谈
查看>>
《Python数据科学实践指南》——0.4节一个简单的例子
查看>>
《树莓派学习指南(基于Linux)》——本章小结
查看>>
中国自主操作系统COS宣传片:很好很强大
查看>>
《SolidWorks 2017中文版机械设计从入门到精通)》——2.2 草图命令
查看>>
Google 开发新的开源系统 Fuchsia
查看>>
社区不是请客吃饭(二)不出国门也能参与OpenStack Summit
查看>>
FreeDOS 诞生二十周年
查看>>