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 相关文章推荐
30个最佳jQuery Lightbox效果插件分享
Apr 11 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
Apr 07 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
JS实现匀速运动的代码实例
Nov 29 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
Aug 27 Javascript
angularjs指令中的compile与link函数详解
Dec 06 Javascript
jquery实现点击展开列表同时隐藏其他列表
Aug 10 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
Feb 12 Javascript
教你用十行node.js代码读取docx的文本
Mar 08 Javascript
详解Angular模板引用变量及其作用域
Nov 23 Javascript
微信小程序生成二维码的示例代码
Mar 29 Javascript
vue路由分文件拆分管理详解
Aug 13 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 分页类 扩展代码
2009/06/11 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
CI框架表单验证实例详解
2016/11/21 PHP
phpStorm2020 注册码
2020/09/17 PHP
自己的js工具 Event封装
2009/08/21 Javascript
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
python的random模块及加权随机算法的python实现方法
2017/01/04 Python
flask框架中的cookie和session使用
2021/01/31 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
顶岗实习计划书
2014/01/10 职场文书
小学家长评语大全
2014/04/16 职场文书
小学教师师德师风个人整改措施
2014/09/18 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
青年联谊会致辞
2015/07/31 职场文书
妇产科护理心得体会
2016/01/22 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python
pandas进行数据输入和输出的方法详解
2022/03/23 Python