Vue中keep-alive组件的深入理解


Posted in Javascript onAugust 23, 2020

前言

最近在写Vue项目的时候,遇到了一个问题,我从A路由使用parmas方式传参跳转到B路由,然后从B路由跳转到C路由,再从C路由返回B路由的时候,发现从A路由传到B路由的参数已经不存在了。

Vue中keep-alive组件的深入理解

正文

我们都知道,vue组件进行路由跳转时,会销毁当前组件。所以从其他路由返回当前路由时,当前路由会重新执行生命周期钩子函数。这就导致了上述问题,A路由传到B路由的参数没了。

当遇到这种问题的时候,我们会首先想到,我们能不能让B路由的数据保存下来呢?这就不得不提到Vue的一个组件了,它就是keep-alive。

keep-alive

<keep-alive>包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
在路由出口加上:

<div id="app">
 <keep-alive>
 <router-view v-if="$route.meta.keepAlive"></router-view>
 </keep-alive>
 <router-view v-if="!$route.meta.keepAlive"></router-view>
 </div>

这样一来的话,如果在路由配置里的meta项加上keepAlive属性且值为true时,当前路由就会被<keep-alive>包裹,变成一个可缓存路由,路由配置:

{
 path: '/order',
 name: 'Order',
 component: () => import('@/views/order/order'),
 meta: {
 keepAlive: true // 需要被缓存
 }
 }

在离开order路由的时候,不会执行销毁操作:

Vue中keep-alive组件的深入理解

可以看到,在返回order路由也就是上述B路由的时候,前一个页面传递过来的数据仍然保留了下来。

<keep-alive>带来的问题

在项目继续进行的时候,出现了另一个问题,当我从选择地址页面选择地址,将地址的id存储到localstorage中,返回order页面并在created生命周期中取到id再进行接口请求,想要拿到这个id相关的地址信息的时候,发现接口请求并未发出:

created() {
 this.userId = JSON.parse(localStorage.getItem("user")).userId
 if (JSON.parse(localStorage.getItem("addressId"))) {
 this.addressId = JSON.parse(localStorage.getItem("addressId"))
 }
 this.getAddress()
 },

于是我在里面加上console.log(1)测试,发现也没有东西打印出来,然后我把created改成mounted,依旧是这样。

Vue中keep-alive组件的深入理解

原因

由于<keep-alive>所包裹的路由具有缓存能力,所以在路由跳转的时候并没有销毁,所以返回来的时候不会执行相关生命周期函数。那么,如果我需要在返回的时候执行例如接口请求之类的操作该怎么办呢?
解决办法

方法一

在需要缓存的页面中使用路由中的beforeRouteEnter方法,只要跳转到了这个路由,这个方法就会执行,在路由跳转前执行相关操作:

beforeRouteEnter(to, from, next) {
  console.log('from', from)
  next(vm => {
  if (from.path == "/selectAddress") {
   // 选择收货地址后返回页面更新收货地址
   vm.addressId = JSON.parse(localStorage.getItem("addressId"))
   vm.getAddress()
  }
  })
 }

vm相当于this,由于路由守卫在导航确认前被调用,因此即将登场的新组件还没被创建,所以直接访问this是访问不到的。

Vue中keep-alive组件的深入理解

方法二

使用activated生命周期钩子函数,这个函数在被 <keep-alive> 缓存的组件激活时调用。

activated () {
  this.addressId = JSON.parse(localStorage.getItem("addressId"))
  this.getAddress()
 },

同样能实现效果。

这里由于我这个页面还需要别的页面跳转过来进行相关操作,要进行路由判断,所以使用的第一种方法。

总结

Vue的 keep-alive 组件可以实现组件数据缓存功能,但是使用时要注意,在组件未销毁时去到当前组件,组件的部分生命周期钩子函数不会执行。这时可以使用 路由守卫 或者是 activated 和 deactivated 生命周期钩子函数实现相关操作。

到此这篇关于Vue中keep-alive组件的深入理解的文章就介绍到这了,更多相关Vue中keep-alive组件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
Feb 04 Javascript
jQuery Dialog 弹出层对话框插件
Aug 09 Javascript
js控制表单奇偶行样式的简单方法
Jul 31 Javascript
javascript实现文本域写入字符时限定字数
Feb 12 Javascript
jquery form表单序列化为对象的示例代码
Mar 05 Javascript
用JavaScript实现类似于ListBox功能示例代码
Mar 09 Javascript
node.js中的fs.appendFileSync方法使用说明
Dec 17 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
Dec 03 Javascript
Vue生命周期示例详解
Apr 12 Javascript
vue2.0父子组件间通信的实现方法
Apr 19 Javascript
vue router 跳转时打开新页面的示例方法
Jul 28 Javascript
利用js canvas实现五子棋游戏
Oct 11 Javascript
google广告之另类js调用实现代码
Aug 22 #Javascript
JS typeof fn === 'function' &amp;&amp; fn()详解
Aug 22 #Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
Aug 22 #Javascript
JavaScript中的函数式编程详解
Aug 22 #Javascript
微信小程序中data-key属性之数据传输(经验总结)
Aug 22 #Javascript
Vue 电商后台管理项目阶段性总结(推荐)
Aug 22 #Javascript
vue实现移动端H5数字键盘组件使用详解
Aug 25 #Javascript
You might like
PHP 裁剪图片成固定大小代码方法
2009/09/09 PHP
PHP 设置MySQL连接字符集的方法
2011/01/02 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
asp 取文本框名称代码
2008/12/02 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
创建一般js对象的几种方式
2017/01/19 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
jQuery按需加载轮播图(web前端性能优化)
2017/02/17 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python生成pdf文件的方法
2014/08/04 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
python实现的生成word文档功能示例
2019/08/23 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
会计与审计毕业生自荐信范文
2013/12/30 职场文书
电气工程师岗位职责
2014/01/01 职场文书
《诺贝尔》教学反思
2014/02/17 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
《坐井观天》教学反思
2016/02/18 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS