前言

遇到这一个个问题  需要是这样的 Vue里面的不刷新问题

页面分为: A 主页  B列表页  C 详情页

A  beforeRouteLeave 时设置 to.meta.keepAlive = false (A 进入 B页面时), 不缓存 B列表页

B beforeRouteLeave 时 (B -> C)列表页进详情页时 from.meta.keepAlive =true 缓存B列表页

C详情页 返回 B列表页 ,此时B列表页缓存不生效,也就是第一次不生效

总结问题原因:

当进入B列表页后,keepAlive 为 true 时,缓存生效

当离开B列表页时 设置 keepAlive 为 true  时 ,缓存不生效

这就是很头疼的问题,查阅相关资料找到

解决

在app.vue 页面

  1. <transition :name="transitionName">
  2. <keep-alive>
  3. <!-- v-if="isRouterALive" :include="[ keepData ]" -->
  4. <router-view class="child-view" v-if="$route.meta.keepAlive" ></router-view>
  5. </keep-alive>
  6. </transition>
  7. <transition :name="transitionName">
  8. <router-view class="child-view" v-if="!$route.meta.keepAlive"></router-view>
  9. </transition>

路由页面配置:

  1. {
  2. path: '/activities/create_proto',
  3. name: 'create_proto',
  4. meta: {
  5. index: 2,
  6. title: '活动创建',
  7. keepAlive: false, //此组件不需要被缓存
  8. rank:1,
  9. },
  10. component: () =>
  11. import (/* webpackChunkName: "create_proto" */'@/pages/activities/create_proto')
  12. },
  13. {
  14. path: '/activities/create/:id',
  15. name: 'create',
  16. meta: {
  17. index: 2,
  18. title: '活动创建',
  19. keepAlive: true, //此组件不需要被缓存
  20. isBack:false, //用于判断上一个页面是哪个
  21. rank:1.5,
  22. },
  23. component: () =>
  24. import (/* webpackChunkName: "create" */'@/pages/activities/create')
  25. },
  26.  
  27. {
  28. path: '/activities/createMask',
  29. name: 'createMask',
  30. meta: {
  31. index: 2,
  32. title: '组',
  33. keepAlive: false, //此组件不需要被缓存
  34. isBack:false, //用于判断上一个页面是哪个
  35. rank:1.5,
  36. },
  37. component: () =>
  38. import (/* webpackChunkName: "createMask" */'@/pages/activities/createMask')
  39. },

让B页面始终是缓存,

然后在B页面 就是 create页面 里:

  1. beforeRouteEnter(to,from,next){
  2. //来自editNotic的不缓存
  3. if(from.name === 'createMask' && to.name === 'create'){
  4. to.meta.isBack = true;
  5. }
  6. next();
  7. },
  8. activated() {
  9. // console.log(this.$route.meta)
  10. if(!this.$route.meta.isBack || this.isFirstEnter){
  11. // 如果isBack是false,表明需要获取新数据,否则就不再请求,直接使用缓存的数据
  12. this.getApi();
  13. }
  14. // 恢复成默认的false,避免isBack一直是true,导致下次无法获取数据
  15. this.$route.meta.isBack=false;
  16. //this.isBack = false;
  17. this.isFirstEnter = false;
  18. },
  19. beforeCreate() {
  20. this.$loading.open();
  21. },
  22.  
  23. mounted(){
  24. this.isFirstEnter = true;
  25. this.getApi();
  26. },

解释一波

缓存的页面 created 会执行只有一次,activated每次都会执行 ,
created 里面做 第一次 isFirstEnter = true(由于页面被缓存,所以一直生效),之后再activated 里面做判断
只有 “不是返回回来的” 和 “第一次进来的” 就刷新数据, 并且要在下面 都设为false, 以免缓存各标识不对,
在进入 “列表页” 时,通过router钩子函数 beforeRouteEnter做判断,
详情页过来的设 isBack 为true,即不刷新页面
 
但第一次都是不生效的,查阅了github 上的大佬方法,就是强制清除B缓存,当B页面离开去到A页面,用rank 来比较
在main.js 中 写入:
  1. Vue.mixin({
  2. beforeRouteLeave: function (to, from, next) {
  3. console.log(to)
  4. if (from && from.meta.rank && to.meta.rank && from.meta.rank > to.meta.rank) { //如果返回上一层,则摧毁本层缓存。
  5. if (this.$vnode && this.$vnode.data.keepAlive) {
  6. if (this.$vnode.parent && this.$vnode.parent.componentInstance && this.$vnode.parent.componentInstance.cache) {
  7. if (this.$vnode.componentOptions) {
  8. var key = this.$vnode.key == null ?
  9. this.$vnode.componentOptions.Ctor.cid + (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '') :
  10. this.$vnode.key;
  11. var cache = this.$vnode.parent.componentInstance.cache;
  12. var keys = this.$vnode.parent.componentInstance.keys;
  13. if (cache[key]) {
  14. if (keys.length) {
  15. var index = keys.indexOf(key);
  16. if (index > -1) {
  17. keys.splice(index, 1);
  18. }
  19. }
  20. delete cache[key];
  21. }
  22. }
  23. }
  24. }
  25. this.$destroy();
  26. }
  27. next();
  28. },
  29. })

就是强制清除缓存,哇,这个问题搞了半天,

然后就解决了前进刷新,后退不刷的问题,

当然还可以结合vuex 来做到效果,但数据比较大的话还是适合 我写的这种吧,哈哈哈

Vue 页面 前进刷新 后退不刷新(keepAlive)的更多相关文章

  1. vue单页应用前进刷新后退不刷新方案探讨

    引言 前端webapp应用为了追求类似于native模式的细致体验,总是在不断的在向native的体验靠拢:比如本文即将要说到的功能,native由于是多页应用,新页面可以启用一个的新的webview ...

  2. vue利用keep-alive/beforeRouteLeave前进刷新后退不刷新(缓存)

      keep-alive缓存 在vue中默认router-link进入页面组件都是不缓存的.对于数据不会更新的页面.可以使用keep-alive来缓存以提高性能. 在项目src/router/inde ...

  3. vue 前进刷新后退不刷新

    这边是router-view部门的写法: <keep-alive> <router-view v-if="$route.meta.keepAlive"/> ...

  4. 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新

    目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...

  5. [转] 2017-11-20 发布 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新

    目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...

  6. 玩转vue前进刷新,后退不刷新and按需刷新

    大白萝卜小课堂开讲了!带你玩转vue前进后退按需刷新! 用vue做后台管理项目,特别是有列表页.列表数据详情页.列表数据修改页功能的码友们,几乎都被vue前进后退都刷新的逻辑坑过,本萝卜更是! 萝卜的 ...

  7. vue vue-router 完美实现前进刷新,后退不刷新。附scrollBehavior源码解析

    需求:在一个vue的项目中,我们需要从一个列表页面点击列表中的某一个详情页面,从详情页面返回不刷新列表,而从列表的上一个页面重新进入列表页面则需要刷新列表. 而浏览器的机制则是每一次的页面打开都会重新 ...

  8. Vue 实现前进刷新,后退不刷新的效果 玩转vue-router里的meta

    Vue 实现前进刷新,后退不刷新的效果 玩转vue-router里的meta. 需求一: 在一个列表页中,第一次进入的时候,请求获取数据. 点击某个列表项,跳到详情页,再从详情页后退回到列表页时,不刷 ...

  9. 单页应用后退不刷新方案(vue & react)

    引言 前进刷新,后退不刷新,是一个类似app页面的特点,要在单页web应用中做后退不刷新,却并非一件易事. 为什么麻烦 spa的渲染原理(以vue为例):url的更改触发onHashChange/pu ...

随机推荐

  1. 支付宝网站即时支付开发,MD5加签名规则处理代码展示

    一.如果传入进来的Object对象,最后生成制定格式的字符换 text: list拼接成字符串,map中的所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,list的元素之间用“| ...

  2. 【Python】【demo实验15】【练习实例】【两个数范围内素数的统计】

    原题: 判断101-200之间有多少个素数,并输出所有素数. 关于素数的统计,之前已经做过相应的实验了,参考:[显示素数,显示两个数范围内的所有素数] 原题给出的解法,使用math的sqrt函数,这个 ...

  3. Oracle的基本操作-修改表结构、数据的增删改查

    创建一个person表 create table person( pid ), pname ) ); 添加一列 ); 修改列类型 ); 修改列名称 alter table person rename ...

  4. Javascript - BOM 对象

    浏览器相关的对象.获取浏览器相关的信息,可以设置和修改浏览器属性. 0. web-app 版 TodoList 小程序 用以下内容可以自己手写一个 TodoList 小程序,再添加几行代码就可以用手机 ...

  5. linux 软连接和 硬链接的区别

    Linux软链接硬链接的区别   ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下 ...

  6. $listeners 在vue中的使用 --初学

    事件回传之 $listeners 组件由下向上回传事件 <!doctype html><html lang="en"> <head> <m ...

  7. P1062 数列 题解

    (题目为啥要强调用十进制输出呢,明明就是故意提醒) 分析一下样例 k=3k=3时,数列为:1,3,4,9,10,12,13..1,3,4,9,10,12,13.. 转换成三进制就是:1,10,11,1 ...

  8. SOS--DP(基础版本)未压缩空间

    #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupp ...

  9. 14-Perl 引用

    1.Perl 引用引用就是指针.Perl 引用是一个标量类型,可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方.2.创建引用定义变量的时候,在变量名前面加个\,就得到了这 ...

  10. winfrom 界面时间动态加载

    Timer time1 = new Timer(); private void time1_Tick(object sender, EventArgs e) { lTime.Text = DateTi ...