如何利用`keep-alive`按需缓存页面数据
随着项目不断变大,页面变多,搜索条件也随之也越来越多,而每次跳转页面再返回时,之前的筛选的条件都会别清空。之前在elment-ui table组件 -- 远程筛选排序提到过缓存,但是有所取巧,这次重新用另一种方式进行实现,或者说是更加合理一些。
场景需求
如何使页面跳转后回来时输入框中输入的值依旧存在?
初步设想
- 利用
keep-alive来缓存组件 - 利用
vuex来实时更新缓存组件的情况及缓存页面的各类筛选条件 - 利用
vue-router来进行预判页面是否需要缓存,从而实时更改缓存组件情况
代码之旅开启
keep-alive提供了几个属性,需要缓存组件名(因而需要缓存的组件都有自己的名称,全局唯一)includeexcludemax
当前主要使用
include来动态更新vue-router- 需要在有需要缓存的页面,在路由
meta属性添加一个字段来进行标识(首次进入) beforeRouteLeave来进行预判当前页面是否需要缓存
- 需要在有需要缓存的页面,在路由
vuex- 缓存筛选条件(有需要在返回页面时回显的数据)
- 动态缓存组件
路由
- 通过路由名跟组件名进行绑定,取名一致(建立隐形关系)
export default [{
path: '/keep',
name: 'Keep', // 既是组件名又是路由名
component: () => import('@/views/keep-alive/index.vue'),
meta: {
alive: true // 通过alive来确定初步是否缓存
}
}]
vuex
- 初始化需要缓存的组件
App.vue
<keep-alive :include="cachedViews">
<router-view></router-view>
</keep-alive>
初始化
mounted () {
this.setInitActiveViews()
}
// 获取需要缓存的组件
getInitActiveViews (routes) {
let views = []
routes.forEach(route => {
if (route.meta && route.meta.alive) {
views.push(route.name)
}
if (route.children) {
const childViews = this.getInitActiveViews(route.children)
if (childViews.length) {
views = [...views, ...childViews]
}
}
})
return views
},
// 存入vuex中
setInitActiveViews () {
const alives = this.getInitActiveViews(this.$router.options.routes)
alives.forEach(item => {
this.$store.commit('cache/addCacheViews', item)
})
}
至此便初步缓存组件了
- 缓存条件
动态增删缓存组件
在需要缓存的组件进行处理
具体的某个组件
created () {
if (!this.$store.state.cache.cachedViews.includes(this.$options.name)) {}// 数据请求
this.$store.commit('cache/addCacheViews', this.$options.name)
},
activated () {
// 数据请求
},
beforeRouteLeave (to, from, next) {
const { name } = to
// 进入当前路由需要缓存条件
const childRouterMap = [
'jsonp'
]
const isCache = childRouterMap.includes(name)
if (!isCache) {
// 清空搜索条件
this.$store.commit('keep/deleteParams')
// 删除缓存
this.$store.commit('cache/deleteViews', this.$options.name)
}
next()
}
此处便可以做到,只有进入
jsonp路由时,页面数据会被缓存,若是进入其他的页面,就会被清空。同时也可以及时刷新页面数据
总结
- 使用
beforeRouteLeave时,需要是在路由被注册的,也就是component: **.vue该组件方可有效 - 由于动态缓存组件一直在改动,目前只有这样实现可以满足需求,后期若是有更好的再进行处理
- 条件尽可以缓存起来,使用vuex最方便了
- 页面数据既可以实时刷新又可以保留条件
- 解决了页面数据缓存,而不是粗暴地通过
v-if来触发组件重新走一遍 - 当前项目地址
参考
如何利用`keep-alive`按需缓存页面数据的更多相关文章
- vue缓存页面【二】
keep-alive是vue内置的一个组件,可以使被它包含的组件处于保留状态,或避免被重新渲染. 用法:运行结果描述:input输入框内,路由切换输入框内部的内容不会发生改变.在keep-alive标 ...
- 如何利用Nginx的缓冲、缓存优化提升性能
使用缓冲释放后端服务器 反向代理的一个问题是代理大量用户时会增加服务器进程的性能冲击影响.在大多数情况下,可以很大程度上能通过利用Nginx的缓冲和缓存功能减轻. 当代理到另一台服务器,两个不同的连接 ...
- 利用chrome插件批量读取浏览器页面内容并写入数据库
试想一下,如果每天要收集100页网页数据甚至更多.如果采用人工收集会吐血,用程序去收集也就成为一个不二的选择.首先肯定会想到说用java.php.C#等高级语言,但这偏偏又有个登陆和验证码,搞到无所适 ...
- Tornado 结合memcached缓存页面
原因 Blog是一个更新并不很频繁的一套系统,但是每次刷新页面都要更新数据库反而很浪费资源,添加静态页面生成是一个解决办法,同时缓存是一个更好的主意,可以结合Memcached添加少量的代码进行缓存, ...
- 利用Jquery的load函数实现页面的动态加载
利用Jquery的load函数实现页面的动态加载 js的强大功能相信大家都知晓,今天通过jquery的库函数load可以更加方便的实现页面的动态刷新,经过几天的研究与探索,终于有所成效!吾心甚蔚! ...
- 使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面
Donut Caching是缓存除了部分内容以外的整个页面的最好的方式,在它出现之前,我们使用"输出缓存"来缓存整个页面. 何时使用Donut Caching 假设你有一个应用程序 ...
- 使用Filter防止浏览器缓存页面或请求结果
仅仅须要两步: 1.定义一个Filter: /** * 防止浏览器缓存页面或请求结果 * @author XuJijun * */ public class NoCacheFilter impleme ...
- Servlet过滤器——使用过滤器禁止浏览器缓存页面
1.概述 IE缓存虽然能提高已储存网站的访问速度,但是过度的IE缓存会影响浏览器的响应速度.同时还可能为网站的运行带来一些不必要的麻烦.例如:可能会因为浏览器缓存的应用,而导致Web服务器不能准确的计 ...
- 利用webBrowser获取框架内Html页面内容
原文:利用webBrowser获取框架内Html页面内容 利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说. 可是一些 HTML 文档由“框架”构成,或可以存放它们自己独特 ...
随机推荐
- BZOJ 4386 Luogu P3597 [POI2015]Wycieczki (矩阵乘法)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4386 (luogu) https://www.luogu.org/pro ...
- CommandLineRunner and ApplicationRunner
1. Run spring boot as a standalone application (non-web) <?xml version="1.0" encoding=& ...
- 第七周总结&实验报告5
这一周的课程内容比较难,而且比较不容易理解,所有学习的很吃力,现在接触的知识越来越多,也越来越难了,还是要多对照书本来进行学习! 这周主要学的有: 一.抽象类 1.Java中可以创建一种类专门用来当作 ...
- bootstrap 学习笔记(部分)
这个课程中的boostrap是3.0+版本的.(2.0与3.0有区别) bootstrap中的JS是依赖于jquery的,所以需要事先引用jquery(1.9.0版本以上). <!DOCTYPE ...
- 使用stringstream代替sprintf和sscanf
C++里面的字符串格式话 之前一直是用的sprintf和sscanf 比较麻烦的是要申请一个字符数组然后在调用 用stringstream就比较完美 int main(int narg,char** ...
- ffmpeg剪切视频
测试的时候需要用到视频,原片太大了,就剪切几分钟来测试 ffmpeg -i input.mp4 -ss 0 -t 300 -acodec copy -vcodec copy -scodec copy ...
- AI换脸必备知识:如何查看显卡型号以及显存大小!
使用Deepfakes(AI换脸) 软件,拼的就是配置,耗的就是时间,考验的是耐心. 配置好了,时间就少了. 所以玩这种软件,硬核需求就是:配置,配置,配置. 我的电脑能跑这个软件么?也是很多新手的 ...
- 自定义Chrome的console(样式、打印图片、开关)
1.常用console类型 console.log() 常规打印 console.warn() 打印警告信息 console.error() 打印错误信息 console.time() 和 conso ...
- 【7】解决:移动端点击a链接出现蓝色边框
[1]_blank : 浏览器总在一个新打开.未命名的窗口中载入目标文档. [2]title : 鼠标悬浮显示的文字. [3]href : 跳转到哪个链接. a{ border: no ...
- flutter 网络请求以及数据处理
网络请求使用FutureBuilder来处理 import 'dart:convert'; Widget build(BuildContext context) { return FutureBuil ...