Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置


Posted in Javascript onMay 10, 2019

需求分析

背景:

1.数据列表页,滚动加载数据;

2.多条数据情况下,点击某一条,进入详细页进行编辑(修改,删除)操作;

3.保存返回上一页;

在上面的情况下,想要保持在上次浏览位置,并且保持数据是最新的;

解决办法

1.原始的办法:在点击详情页的时候,记住浏览位置,传递参数或者存到本地缓存,然后在详情页操作完毕后,返回的时候,路由守卫可以判断,是否详情页跳转回来的,然后让页面滚动到上次记录的位置;

思路是这样,实际操作很麻烦;

2.推荐办法:使用vue动态组件keep-alive,搭配路由守卫函数beforeRouteLeave,以及activated钩子函数;

对于钩子函数执行顺序,以及作用详细说明,请参考vue组件的生命周期

步骤详解

我的步骤是按照开发思路进行的,场景就是从商品列表页——>商品详细页——>商品列表(数据缓存);

开发之前看到网上好多人都是在路由文件里面配置

meta:{keepAlive:true}

但我觉得没有必要,因为列表页不是一直需要缓存数据的,假如从首页进入,则不需要,所以就在路由守卫函数中判断是否需要缓存数据即可;

以下代码,使用list.vue代表列表页;detail.vue代表详细页;

场景1:点击返回,判断路由跳转的是否是需要缓存的列表页:

detail.vue

beforeRouteLeave (to, from, next) {
 if (to.name === 'M2mBoard') {
 to.meta.keepAlive = true
 }
 next()
 }

由于keepAlive是vue2.0中内置组件,所以设置页面路由meta.keepAlive = true即可缓存数据,路由跳转是利用函数this.$router.go(-1);就可以显示在上次浏览的记录位置;

场景2:编辑详细页数据,回到列表页,则需要将修改的数据保存到本地,然后在列表页的缓存数据中,更改显示即可:

detail.vue

beforeRouteLeave (to, from, next) {
 if (to.name === 'M2mBoard') {
 to.meta.keepAlive = true
 }
 if (this.isChange) {
 let changeData = {
 inquiryNo: this.inquiry.inquiryNo,
 inquiryTitle: this.inquiry.inquiryTitle
 }
 window.sessionStorage.setItem('changeData', JSON.stringify(changeData))
 }
 to.meta.isChange = this.isChange
 next()
 }

列表页中判断一下,是否需要修改数据:

list.vue

activated () {
 if (this.$route.meta.isChange) {
 let changeData = JSON.parse(window.sessionStorage.getItem('changeData'))
 this.list.forEach(item => {
 if (item.inquiryNo === changeData.inquiryNo) {
  item.inquiryTitle = changeData.inquiryTitle
 }
 })
 }
 }

activated 钩子函数,在keep-alive组件激活时自动执行,判断如果需要修改,从本地取出数据,循环列表数据,找出需要修改的那一条,进行显示数据的修改(因为是临时修改,所以只修改显示的参数即可);

场景3:在详细页点击删除该条数据

detail.vue

beforeRouteLeave (to, from, next) {
 if (to.name === 'M2mBoard' && !this.idDel) {
 to.meta.keepAlive = true
 }
 next()
 }

删除操作,可以排除后直接不用缓存,或者跟修改一样的操作,判断是删除,临时删除,列表中缓存的数据也可以;

上面3种情况通常会同时出现,所以最后的写法就是:

detail.vue

beforeRouteLeave (to, from, next) {
 if (to.name === 'M2mBoard' && !this.idDel) {
 to.meta.keepAlive = true
 }
 if (this.isChange) {
 let changeData = {
 inquiryNo: this.inquiry.inquiryNo,
 inquiryTitle: this.inquiry.inquiryTitle
 }
 window.sessionStorage.setItem('changeData', JSON.stringify(changeData))
 }
 to.meta.isChange = this.isChange
 next()
 }

list.vue

beforeRouteLeave (to, from, next) {
 from.meta.keepAlive = false
 next()
 },
 activated () {
 if (this.$route.meta.isChange) {
 let changeData = JSON.parse(window.sessionStorage.getItem('changeData'))
 this.list.forEach(item => {
 if (item.inquiryNo === changeData.inquiryNo) {
  item.inquiryTitle = changeData.inquiryTitle
 }
 })
 }
 }

列表页种路由跳转的时候需要进行meta.keepAlive = false操作,防止出现,从detail.vue跳转回来后,list.vue在与其他页面进行路由跳转的时候,始终处于缓存状态,数据不更新现象;

注意:在info.vue跳转list.vue的路由活动最好使用this.$router.go(-1),不然回到list.vue页面,数据缓存了,但是页面位置不会是上次访问的位置;具体原因还在研究,哈哈哈...

ok,上面就是在项目开发使用中用到的keep-alive的整个思路;记录一下,以免忘记,还有欢迎参考与指正。

以上所述是小编给大家介绍的Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
Extjs gridpanel 出现横向滚动条问题的解决方法
Jul 04 Javascript
表单验证的完整应用案例探讨
Mar 29 Javascript
JS获取单击按钮单元格所在行的信息
Jun 17 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
Sep 19 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
Jan 17 Javascript
Bootstrap基本样式学习笔记之标签(5)
Dec 07 Javascript
javascript表达式和运算符详解
Feb 07 Javascript
js判断手机系统是android还是ios
Mar 07 Javascript
移动端刮刮乐的实现方式(js+HTML5)
Mar 23 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
Jul 19 Javascript
浅析前端路由简介以及vue-router实现原理
Jun 01 Javascript
深入浅出理解JavaScript高级定时器原理与用法
Aug 02 Javascript
vue无限轮播插件代码实例
May 10 #Javascript
js中的深浅拷贝问题简析
May 10 #Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
May 10 #Javascript
详解jQuery如何实现模糊搜索
May 10 #jQuery
JS匿名函数内部this指向问题详析
May 10 #Javascript
详解关于React-Router4.0跳转不置顶解决方案
May 10 #Javascript
Vue使用watch监听一个对象中的属性的实现方法
May 10 #Javascript
You might like
用Simple Excel导出xls实现方法
2012/12/06 PHP
8个必备的PHP功能实例代码
2013/10/27 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
php短址转换实现方法
2015/02/25 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
2017/03/08 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
2017/03/17 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
python实现人脸签到系统
2020/04/13 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
2015年小学开学寄语
2015/02/27 职场文书
考试没考好检讨书
2015/05/06 职场文书
2016小学新学期寄语
2015/12/04 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
opencv检测动态物体的实现
2021/07/21 Python
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技