vue中keep-alive、activated的探讨和使用详解


Posted in Javascript onJuly 26, 2020

在修改公司的一个项目的时候发现了activated这个东西,一直觉得很疑惑,之前也没怎么用过啊!官网的生命周期那也没说过这东西啊!生命周期不就create mount update 和destory这几个东东么,怎么多了个activate出来。

百思不得其解,于是去问了下度娘和查了下文档!恍然大悟,原来这东东是结合keep-alive这东东使用的,下面顺便记录一下。

keep-alive

<keep-alive>包裹动态组件的时候,会缓存不活动的组件实例,而不是摧毁他们。其是一个抽象的组件,自身不会渲染一个DOM元素,也不会出现在父组件链中。

说白了被<keep-alive>包裹的组件其会被缓存

废话不多说直接上例子.

我们现在创建两个子组件conpoment1,compoment2,其内容如下

<template>
 <div class="wrapper">
  <ul class="content"></ul>
  <button class="add" id="add" @click="add">添加子元素</button>
 </div>
</template>

<script>
export default {
 data() {
  return {};
 },
 methods: {
  add() {
   let ul = document.getElementsByClassName("content")[0]; 
   let li = document.createElement("li");
   li.innerHTML = "我是添加的元素";
   ul.appendChild(li);   
  }
 }
};
</script>
<style >
</style>

代码不用解释了吧,就是点击按钮在ul动态添加一个li元素。

接着我们在路由中注册一下,再回到APP.vue中修改一下配置

<template>
 <div id="app">
  <keep-alive>
   <router-view />
  </keep-alive>
</template>

这样我们就会发现,当我们切换路由的时候,我们之前添加的子元素还回保存在那里

vue中keep-alive、activated的探讨和使用详解

如果是这样的话所有的页面都被缓存了,一些需要重新加载不需要缓存的我们可以通过v-for来实现。当然我们可以在路由中设置一个key值来判断组件是否需要缓存,就像下面这样

//index.js
{
   path: '/1',
   name: 'components1',
   component: Components1,
   meta: {
    keepAlive: true  //判断是否缓存
   }
  },
  {
   path: '/2',
   name: 'components2',
   component: Components2,
   meta: {
    keepAlive: false
   }
  },

然后我们的App.vue中只需要判断其keepAlive值即可

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

这时候我们回到页面中添加子元素并切换路由就会发现只有components1中的组件有缓存。

activated

先说下这个生命周期钩子,官网说其是在服务器端渲染期间不被调用,

说白了其就是在挂载后和更新前被调用的。但如果该组件中没有使用缓存,也就是没有被<keep-alive>包裹的话,activated是不起作用的。我们直接来试一下就知道了。

//components1中
 created() {
  console.log("1激活created钩子函数");
 },
 activated() {
  console.log("1激活activated钩子函数");
 },
 mounted() {
  console.log("1激活mounted钩子函数");
 }

//components2中
 created() {
  console.log("2激活created钩子函数");
 },
 activated() {
  console.log("2激活activated钩子函数");
 },
 mounted() {
  console.log("2激活mounted钩子函数");
 }

我们在2个组件中分别打印出其钩子函数执行情况。我们可以看到

vue中keep-alive、activated的探讨和使用详解

在执行components1时候其是执行了activated钩子函数的,而components2则没有,因为components2并没有被<keep-alive>包裹,所以其并不会激活该钩子函数。

当我们再切换一次路由的时候又发现了神奇的地方

vue中keep-alive、activated的探讨和使用详解

组件1中只执行activated钩子钩子函数,而组件2则把创建和挂载的钩子函数都执行了。

这就是缓存的原因,components其对组件进行了缓存所以并不会再一次执行创建和挂载。

简单的说activated()函数就是一个页面激活后的钩子函数,一进入页面就触发;

所以当我们运用了组件缓存时,如果想每次切换都发送一次请求的话,需要把请求函数写在activated中,而写在created或mounted中其只会在首次加载该组件的时候起作用。

以上这篇vue中keep-alive、activated的探讨和使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
网页自动刷新,不产生嗒嗒声的一个解决方法
Mar 27 Javascript
JS 自定义函数缺省值的设置方法
May 05 Javascript
BOM与DOM的区别分析
Oct 26 Javascript
javascript轻量级模板引擎juicer使用指南
Jun 22 Javascript
JavaScript对象反射用法实例
Apr 17 Javascript
举例讲解jQuery中可见性过滤选择器的使用
Apr 18 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
js无法获取到html标签的属性的解决方法
Jul 26 Javascript
关于JavaScript 原型链的一点个人理解
Jul 31 Javascript
jquery 正整数数字校验正则表达式
Jan 10 Javascript
JavaScript之Date_动力节点Java学院整理
Jun 28 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
Nov 15 Javascript
关于angular浏览器兼容性问题的解决方案
Jul 26 #Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
Jul 26 #Javascript
使用React-Router实现前端路由鉴权的示例代码
Jul 26 #Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
Jul 26 #Javascript
vue 页面回退mounted函数不执行的解决方案
Jul 26 #Javascript
vuex分模块后,实现获取state的值
Jul 26 #Javascript
何时/使用 Vue3 render 函数的教程详解
Jul 25 #Javascript
You might like
php和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
PHP新手入门学习方法
2011/05/08 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
php框架知识点的整理和补充
2021/03/01 PHP
动态调用CSS文件的JS代码
2010/07/29 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
JavaScript事件 &quot;事件对象&quot;的注意要点
2016/01/14 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
微信小程序模板(template)使用详解
2018/01/31 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
Python及PyCharm下载与安装教程
2017/11/18 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
2018/12/18 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
银行出纳岗位职责
2013/11/25 职场文书
应届毕业生求职信
2013/11/30 职场文书
授权收款委托书
2014/09/23 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
儿子满月酒致辞
2015/07/29 职场文书
一篇文章弄懂Python中的内建函数
2021/08/07 Python
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫