热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VuekeepAlive数据缓存东西,完成返回上一个页面阅读的位置;

需求剖析背景:1.数据列表页,转动加载数据;2.多条数据状况下,点击某一条,进入细致页举行编辑(修正,删除)操纵;3.保留返回上一页;在上面的状况下,想要坚持在上次阅读位置,而且坚

需求剖析

背景:
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的全部思绪;纪录一下,以避免遗忘,另有迎接参考与斧正。


推荐阅读
author-avatar
恩和佳蓉伟诚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有