vue中keep-alive组件的入门使用教程


Posted in Javascript onJune 06, 2019

一、问题触发并解决

最近自己在写vue练习,内容相对简单,主要是对vue进行熟悉和相关问题发现,查漏补缺。简单说下练习的项目内容及问题的产生:

练习使用的vue-cli 2.0脚手架搭建,内容就是简单的仿音乐播放app,功能也相对简单,大体就是单页router切换各个专辑列表,点击进入专辑内容页面,单击歌曲名称可以进行播放、暂停、下一曲功能。

简单的背景介绍完了,说下问题产生的情形:在从整个歌曲列表页点击跳转到单个专辑列表页,然后点击返回按钮返回歌曲列表页时,页面保存了之前的浏览位置,但是接口重新请求了数据,因为歌曲列表页有滚动加载效果,所以数据获取在vuex里用了数组的concat方法,导致返回请求的数据重新加载了列表里,而v-for循环由于key值有了重复,导致控制台报错;说起来可能比较难懂,上一些基本的代码部分:

vuex里获取列表数据:
GET_COLLECTION_LIST(state, val) { state.collectionList = state.collectionList.concat(val)}

歌曲列表里created获取数据,mounted监听滚动事件滚动加载,destroyed取消监听:
created(){ this.collectionListMethod({limit: this.limit, offset: this.offset})},
mounted(){ window.addEventListener('scroll', this.isScrollBot)}
destroyed(){ window.removeEventListener('scroll', this.isScrollBot)}

专辑列表页返回使用的是 this.$router.go(-1)

有问题就要解决问题,通过查询了解到keep-alive可以对数据进行缓存,路由切换的时候可以使用缓存不用重新触发接口请求,貌似可以很完美解决问题,实践出真知,在代码里添加:

首先在歌曲列表路由里添加meta:{keepAlive: true}为后面的router-view是否需要缓存提供标识
{ path: '/songLis', component: SongLis, meta: { keepAlive: true }}
然后在router-view外层添加keep-alive,并根据meta参数判断是否所有路由都需要缓存
<keep-alive>
  <router-view v-if="$route.meta.keepAlive" />
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"/>

添加完毕,回到页面看效果!可喜可贺的是控制台不报错了,说明keep-alive起作用了,撒花庆祝~~~ 但是事情并没有那么简单,当我们从专辑列表切到其他路由,滚动鼠标会发现滚动加载的监听事件没有取消,组件destroyed的时候明明取消监听了啊!而且再切回到专辑列表页的时候,滚动加载反而不执行了,表示一脸懵~

经过查看vue文档,发现文档有这么一句话:

<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

也就是说使用keep-alive的组件不会触发destroyed钩子方法,这就是取消监听失败的原因。根据文档介绍,keep-alive切换时,会触发自己的activeted和deactiveted两个钩子函数,可以理解为vue的created和destroyed两个钩子,因此需要修改代码,在deactivated时候取消监听,同时在activated的时候恢复监听,否则切回去的时候滚动监听也不会有效果:

//keep-alive钩子函数,组件恢复时触发
activated(){ window.addEventListener('scroll', this.isScrollBot)},
//keep-alive钩子函数,组件变为不可用时触发
deactivated(){ window.removeEventListener('scroll', this.isScrollBot)}

修改后的效果完全符合预期,切换路由页面保留当位置,不会重复请求接口而且也不会在专辑列表组件外部触发滚动加载。

二、关于keep-alive

既然用到了keep-alive,就通过文档简单总结下相关使用:

上面已经说过,通过keep-alive包裹的组件,在不活动时会缓存组件实例,不会对组件进行销毁,再次处于活动状态时,会读取缓存的内容并保存组件状态,不用重复请求接口获取数据。

(1)最基本使用基本用法:

基本用法:
<keep-alive>
 <component :is="view"></component>
</keep-alive>

也可以根据条件判断:
<keep-alive>
 <comp-a v-if="a > 1"></comp-a>
 <comp-b v-else></comp-b>
</keep-alive>
这个时候触发两个组件切换时,组件内的数据和状态都会得到保存,如果有input输入框,输入框内容会保留

(2)有条件的缓存

keep-alive提供了include、exclude、max三个参数,前两个允许组件有条件的进行缓存,两者都可以接受字符串、正则、数组形式;max表示最多可以缓存多少个组件,接受一个number类型。

<keep-alive include="a,b">
 <component :is="view"></component>
</keep-alive>
此时只有a、b两个组件会触发keep-alive,此处的名字是组件内部name对应名字,如果name不存在,会查找父组件里components里注册的名字,如果也不存在则不会匹配。
正则和数组方法同上,但是需要用v-bind:include=''方式。

<keep-alive :max="10">
 <component :is="view"></component>
</keep-alive>

(3)钩子函数

两个钩子函数activated和deactivated,上面已经说过,分别在组件恢复活动状态和组件失去活动状态时触发,可以起到类似created和destroyed钩子作用。

以上是对keep-alive的个人使用和理解,如有不足还望指正~

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery 页面全选框实践代码
Apr 02 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
Feb 13 Javascript
查找Oracle高消耗语句的方法
Mar 22 Javascript
Jquery中find与each方法用法实例
Feb 04 Javascript
jQuery表单域属性过滤器用法分析
Feb 10 Javascript
js 获取当前web应用的上下文路径实现方法
Aug 19 Javascript
JavaScript对象_动力节点Java学院整理
Jun 23 Javascript
angular或者js怎么确定选中ul中的哪几个li
Aug 16 Javascript
vue的状态管理模式vuex
Nov 30 Javascript
原生JS实现动态添加新元素、删除元素方法
May 05 Javascript
Websocket 向指定用户发消息的方法
Jan 09 Javascript
vue实现两个组件之间数据共享和修改操作
Nov 12 Javascript
vue2配置scss的方法步骤
Jun 06 #Javascript
JavaScript中将值转换为字符串的五种方法总结
Jun 06 #Javascript
详解Vue 如何监听Array的变化
Jun 06 #Javascript
js常见遍历操作小结
Jun 06 #Javascript
vue中v-show和v-if的异同及v-show用法
Jun 06 #Javascript
vue中的过滤器实例代码详解
Jun 06 #Javascript
Vue响应式原理Observer、Dep、Watcher理解
Jun 06 #Javascript
You might like
PHP stream_context_create()作用和用法分析
2011/03/29 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
Smarty保留变量用法分析
2016/05/23 PHP
php+redis实现消息队列功能示例
2019/09/19 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
Python监控主机是否存活并以邮件报警
2015/09/22 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
如何进行Linux分区优化
2013/02/12 面试题
工程造价与管理专业应届生求职信
2013/11/23 职场文书
校园演讲稿汇总
2014/05/21 职场文书
英语教师求职信
2014/06/16 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS