vue中keep-alive、activated的探讨和使用「建议收藏」

vue中keep-alive、activated的探讨和使用「建议收藏」在修改公司的一个项目的时候发现了activated这个东西,一直觉得很疑惑,之前也没怎么用过啊!官网的生命周期那也没说过这东西啊!生命周期不就createmountupdate和destory这几个东东么,怎么多了个activate出来。百思不得其解,于是去问了下度娘和查了下文档!恍然大悟,原来这东东是结合keep-alive这东东使用的,下面顺便记录一下。 keep-ali………

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

在修改公司的一个项目的时候发现了activated这个东西,一直觉得很疑惑,之前也没怎么用过啊!官网的生命周期那也没说过这东西啊!生命周期不就create mount update 和destory这几个东东么,怎么多了个activate出来。
百思不得其解,于是去问了下度娘和查了下文档!恍然大悟,原来这东东是结合keep-alive这东东使用的,下面顺便记录一下。

 
顺便插个tip:富途2023届校招内推,需要内推的联系我哈!

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>

Jetbrains全家桶1年46,售后保障稳定

代码不用解释了吧,就是点击按钮在ul动态添加一个li元素。
接着我们在路由中注册一下,再回到APP.vue中修改一下配置

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

这样我们就会发现,当我们切换路由的时候,我们之前添加的子元素还回保存在那里
在这里插入图片描述
如果是这样的话所有的页面都被缓存了,一些需要重新加载不需要缓存的我们可以通过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个组件中分别打印出其钩子函数执行情况。我们可以看到

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

当我们再切换一次路由的时候又发现了神奇的地方
在这里插入图片描述
组件1中只执行activated钩子钩子函数,而组件2则把创建和挂载的钩子函数都执行了。
这就是缓存的原因,components其对组件进行了缓存所以并不会再一次执行创建和挂载。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198384.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java的Scanner输入时,next()和nextLine()的区别[通俗易懂]

    Java的Scanner输入时,next()和nextLine()的区别[通俗易懂]nextLine()不要和其他next方法一起用!!!尤其nextLine()不要放在它们后面!!!这个问题已经坑了我好多次了,但是每次都没有在意,主要是没反应过来出现问题的原因。今天阿里内推测验,又被nextLine()狠狠坑了一下。逻辑思路都是对的,就输入的数据不对。因为限时半小时,所以时间比较紧张,最后还是没弄出来。后来百度查了两者区别,果然问题是出在这里,改完之后问题就解决了。可怜我的…

    2022年6月10日
    43
  • java 远程debug_idea如何debug

    java 远程debug_idea如何debug使用IDEA远程Debug线上服务应用背景配置过程IDEA配置服务启动配置应用方法注意事项应用背景通常情况下我们会遇到只有线上环境才能复现的bug,此时通过在代码里面加日志重新发布,反复定位对线上的客户体验极度不好,此时我们可以使用IDEA的远程Debug功能,对线上bug调试。配置过程该过程需要本地环境和线上环境至少保证指定端口互通,该端口指的是线上debug对项目的监听端口。IDEA配置首先在IDEA上进行配置,进入项目启动面板,Edit-config中设置点击”+“号选中”Remo

    2025年8月28日
    6
  • rtp协议详解

    rtp协议详解RTP的头部格式版本号(V):2比特,用来标志使用的RTP版本。填充位(P):1比特,如果该位置位,则该RTP包的尾部就包含附加的填充字节。扩展位(X):1比特,如果该位置位的话,RTP固定头部后面就跟有一个扩展头部。CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。标记位(M):1比特,该位的解释由配置文档(Profile)来承担….

    2022年6月28日
    41
  • 利用git上传本地文件、文件夹到Github

    利用git上传本地文件、文件夹到Github利用git上传文件至github是特别常用的,总结以下内容供参考使用。第一步:下载git工具,[这里是链接](https://git-scm.com/downloads),选择适合自己的版本进行安装。第二步:安装完成后,找到Gitbash,双击打开。第三步:输入自己的用户名和邮箱(为注册GITHUB账号时的用户名和邮箱)$gitconfig–globaluser.name”co

    2022年5月13日
    40
  • c语言里的pow函数「建议收藏」

    头文件:#include&lt;math.h&gt;pow()函数用来求x的y次幂(次方),x、y及函数值都是double型,其原型为:  doublepow(doublex,doubley);pow()用来计算以x为底的y次方值,然后将结果返回。设返回值为ret,则 ret=xy。可能导致错误的情况:如果底数x为负数并且指数y不是整数,将会导致do…

    2022年4月5日
    97
  • spring事务的传播机制

    spring事务的传播机制什么是事务 数据库事务是指一系列严密操作 要么全部成功 要么全部失败 它有四种特性 原子性 一致性 隔离性和持久性 而 spring 事务是封装在数据库事务之上的一种事务处理机制 它有两种管理方式 编程式事务和声明式事务 在平时使用中 我们大多使用 Transactiona 声明式事务来管理 这也是 spring 推荐的方式 下面例子也统一采用此种方式 下面我们主要来看看 spring 事务的传播机制 spring 事务的传播机制 spring 事务的传播机制有七种 REQUIRED REQUIRES NEW NES

    2025年6月5日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号