参考:

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

vue,vue-router实现浏览器返回不刷新页面

vue 怎么处理当this.$router.go(-1)时,判断返回指定页面设置指定页面的keepAlive为true?

vue中 beforeRouteLeave 生命周期函数

Vue - 生命周期函数(activated)

Vue中使用keepAlive不缓存问题(已解决)

js中判断数组中是否包含某元素的方法

vue中使用keepAlive组件缓存,如何清缓存(有些时候页面不需要缓存)

另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新[最后的思路借鉴的这个]

eventBus实现兄弟,父子之间传值

初步设计

思路

给需要缓存的页面路由添加meta.keepAlive=false

在 app.vue 中用 keepalive 组件包裹 router-view

在 BlogDetail 的路由离开钩子beforeRouteLeave里面判断to.path去的是我们的缓存页面,然后设置to.meta.keepAlive=true

遇到的问题

缓存页面初次加载时没有人给它设置 keepAlive,在第一次从缓存页面跳转出去再返回时,页面才会刷新并缓存,也就是说第二次返回到缓存页面才会由保留了上级页面浏览记录的效果。

二次设计

思路

给需要缓存的页面路由添加meta.keepAlive=true,常驻缓存

在删除文章时置 isDeleted 为 true,然后在离开钩子beforeRouteLeave里判断isDeleted为true就置meta.keepAlive=false取消缓存

遇到的问题

一但有文章删除,缓存页面的meta.keepAlive就被永久置 false,无法继续提供缓存。

同时详情页编辑保存后再返回缓存的列表页,列表页不会展示更新后的文章

三次设计

思路

在常驻缓存的基础上,在meta中再添加一个变量isBack=false

然后在缓存页面的进入钩子函数beforeRouterEnter中去判断from.path从哪些页面路由过来需要做缓存,需要做缓存时把 isBack 置 true。

最后在缓存页面的activated钩子函数里判断 isBack 的值,为 true 时去调用接口更新数据,这样就可以在缓存上次浏览记录的同时更新了数据(执行到activated已经走了缓存)。在函数最后记得重新置 isBack 为 false。

遇到的问题

因为删除在详情页,查看详情和删除后的返回from都是详情页,缓存页面钩子beforeRouterEnter中无法分辨导致删除后也走了缓存,没有刷新缓存页数据。

当然这里可以使用自定义一个组件 eventBus 然后父子$emit传值的方式通知到缓存页是否删除;也可以在详情页的beforeRouteLeave中给 to 或者 from 修改某些属性作为标记(不能新增),然后在缓存页钩子中拿到标记判断是不是删除。

最终设计

思路

同样是meta.keepAlive=true常驻缓存,不再设置 isBack 去判断哪个页面返回才刷新数据,直接在缓存页面的activated中请求接口刷新数据,因为已经走到了activated,缓存了滚动进度等,刷新数据也符合业务逻辑。

然后刷新数据需要前一次访问的查询和分页参数,可以在路由 meta 中定义一个 param,在缓存页面路由离开的时候把查询和分页参数保存到 param,在返回缓存页面加载到activated的时候拿到 meta 中的 param 然后用这些参数请求接口刷新数据。

遇到的问题

有一部分跳转是用的 href 跳转,href 跳转在go(-1)返回时用的浏览器的缓存,虽然也经过了vue的各个生命周期、请求了数据接口更新了数据,但页面确实没有更新。比如我的发布文章。

后面都把 href 改成了路由跳转,完美解决。

相关的知识

钩子函数执行顺序:

不使用 keep-alive

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

使用 keep-alive

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

再次进入缓存的页面,只会触发

beforeRouteEnter -->activated --> deactivated

createdmounted不会再执行。

vue使用keepalive缓存上级页面的更多相关文章

  1. 示例vue 的keep-alive缓存功能的实现

    本篇文章主要介绍了vue 的keep-alive缓存功能的实现,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Vue 实现组件信息的缓存 当我们 ...

  2. vue中如何缓存一些页面

    在vue中,有时候我们只想缓存页面中的一些组件或页面,这个时候怎么办呢,我们就需要用判断来加载keep-alive. 例如: // router.js { path: "/driving_l ...

  3. vue 中 keep-alive 缓存数据、离开时位置

    路由中: 页面中: 需要缓存的组件中: 因为是keep-alive  所以在初始化页面的时候 会走一次生命周期 当二次进入的时候就已经是缓存状态了 不会在走生命周期 于是它就有了自己的周期函数分别是 ...

  4. Vue 缓存当前页面keep-alive

    需求: 产品经理在列表页(几千个数据,n个page)点击某一项进去到详情页后,再返回到列表页发现页面回到了第一页,找不到之前的查看的是哪一条了,为了方便咋公司产品经理,返回列表页时需要记住之前的pag ...

  5. vue单页应用中 返回列表记住上次滚动位置、keep-alive缓存之后更新列表数据 那点事

    实践场景需求 产品列表中,滚动到一定位置的时候,点击查看产品信息,后退之后,需要回到原先的滚动位置,这是常见的需求 所有页面均在router-view中,暂时使用了keep-alive来缓存所有页面, ...

  6. Vue keep-alive如何实现只缓存部分页面

    prop: include: 字符串或正则表达式.只有匹配的组件会被缓存. exclude: 字符串或正则表达式.任何匹配的组件都不会被缓存. 在2.1.0版本Vue中 常见用法: // 组件 exp ...

  7. Vue 之keep-alive的使用,实现页面缓存

    什么是keep-alive 有时候我们不希望组件被重新渲染影响使用体验: 或者处于性能考虑,避免多次重复渲染降低性能.而是希望组件可以缓存下来,维持当前的状态.这时候就需要用到keep-alive组件 ...

  8. vue缓存之keep-alive,设置想要缓存的页面

    由于项目需求从a页面跳转到b页面,返回a页面,a页面数据不能被刷新掉,方法很多列举12 方法1 a页面通过学期按钮切换学期,该学期里more进入b页面,返回a页面,返回回到对应a页面进入的高亮按钮设置 ...

  9. Vue路由开启keep-alive缓存页面

    mode:hash模式下: HTML部分: <template> <div id="app"> <keep-alive> <!--使用ke ...

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

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

随机推荐

  1. python logger 按时间段滚动

    import logging import logging, logging.handlers import time logging.getLogger().setLevel(logging.DEB ...

  2. protobuf遇坑总结

    在一个vs2013解决方案下创建了三个工程文件,在其中一个工程(Foundation)中放有CtrlMessage.pb.h和ControlMessageTags的头文件.编译后出错总共68处. 错误 ...

  3. 像MIUI一样做Zabbix二次开发(5)——那些坑和优化方向

    踩过的那些坑 从2011年开始玩Zabbix,踩过的坑着实不少,被研发的同事吐了无数槽,所谓"情到深度又爱又恨".以下简述印象比较深刻的几个坑: 二次开发的方式:2011刚开始做的 ...

  4. maven重点分析

    目录 什么是maven pom.xml 约定大于配置 根元素和必要配置 父项目和parent元素 项目构建需要的信息 路径管理 资源管理 详细使用 filtering的使用 怎么理解pom中多个res ...

  5. redis info 对应参数详解

    https://blog.csdn.net/qq_27342265/article/details/123094422 info命令的使用方法有以下三种: info:部分Redis系统状态统计信息.i ...

  6. wxPython绘图API

    简单介绍一个Pthon的绘图库wxPython. GDI+(图形绘制接口),CoreGraphics和Cairo库形成wxPython绘图API的框架.wx.GraphicsContext是主要绘制对 ...

  7. 4. 模板解析,生成render函数,渲染页面

    解析模板,生成render函数,执行render函数,实现视图渲染 1.模板转化成ast语法树 2.ast语法树生成render函数 3.执行render函数生成虚拟dom 4.执行_update方法 ...

  8. express的使用:接口的编写(三)

    1.接口的跨域问题 a.CORS,主流 b.JSONP,只支持get请求 步骤:a.安装 npm install cors b.使用  const cors = require('cors') 导入中 ...

  9. Pytest Fixture(二)

    作用域 固件的作用是为了抽离出重复的工作和方便复用,为了更精细化控制固件(比如只想对数据库访问测试脚本使用自动连接关闭的固件),pytest 使用作用域来进行指定固件的使用范围. 在定义固件时,通过  ...

  10. 网络时间同步系统(NTP授时服务器)在电信网络的技术性应用研究

    网络时间同步系统(NTP授时服务器)在电信网络的技术性应用研究 网络时间同步系统(NTP授时服务器)在电信网络的技术性应用研究 岳峰 15901092122 --------------------- ...