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 相关文章推荐
jQuery 获取对象 定位子对象
May 31 Javascript
jQuery渐变发光导航菜单的实例代码
Mar 27 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
Sep 10 Javascript
JS运动基础框架实例分析
Mar 03 Javascript
location.hash保存页面状态的技巧
Apr 28 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
Mar 14 Javascript
Vue.js学习笔记之修饰符详解
Jul 25 Javascript
JScript实现表格的简单操作
Aug 15 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
Aug 10 Javascript
Vuejs+vue-router打包+Nginx配置的实例
Sep 20 Javascript
Vue 幸运大转盘实现思路详解
May 06 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
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
关于递归运算的顺序测试代码
2011/11/30 Javascript
javascript面向对象编程代码
2011/12/19 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
js实现导航吸顶效果
2017/02/24 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
django框架如何集成celery进行开发
2017/05/24 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
车间统计员岗位职责
2014/01/05 职场文书
新领导上任欢迎词
2014/01/13 职场文书
读书演讲主持词
2014/03/18 职场文书
调研汇报材料范文
2014/08/17 职场文书
教师旷工检讨书
2015/08/15 职场文书
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript