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 相关文章推荐
js 绑定键盘鼠标事件示例代码
Feb 12 Javascript
基于javascript如何传递特殊字符
Nov 30 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
Feb 17 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
Mar 05 Javascript
JS闭包与延迟求值用法示例
Dec 22 Javascript
Vue波纹按钮组件制作
Apr 30 Javascript
vue-content-loader内容加载器的使用方法
Aug 05 Javascript
Javascript中绑定click事件的四种方式介绍
Oct 26 Javascript
今天,小程序正式支持 SVG
Apr 20 Javascript
详解微信小程序开发之formId使用(模板消息)
Aug 27 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
Sep 11 Javascript
React实现轮播效果
Aug 25 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
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
javascript实现table表格隔行变色的方法
2015/05/13 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
Python编程argparse入门浅析
2018/02/07 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
python 获取字符串MD5值方法
2018/05/29 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
python cookie反爬处理的实现
2020/11/01 Python
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
电气自动化自荐信
2013/10/10 职场文书
工作交流会欢迎词
2014/01/12 职场文书
《燕子》教学反思
2014/02/18 职场文书
黄金搭档广告词
2014/03/21 职场文书
教师演讲稿开场白
2014/08/25 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
二婚主持词
2015/06/30 职场文书
工伤调解协议书
2016/03/21 职场文书
MySQL基础(二)
2021/04/05 MySQL
Python入门之使用pandas分析excel数据
2021/05/12 Python
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技