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

本文深入探讨Vue中keep-alive组件的使用及activated生命周期钩子的作用,揭示组件缓存机制,阐述如何通过缓存提高应用性能,并解析activated在组件激活时的触发条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在修改公司的一个项目的时候发现了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>

代码不用解释了吧,就是点击按钮在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中其只会在首次加载该组件的时候起作用。

### Vue3 中 `keep-alive` 的 `activated` 生命周期钩子使用 #### 一、`keep-alive` 其作用 `keep-alive` 是 Vue 提供的一个内置组件,用于缓存动态组件实例,从而避免重新渲染已加载过的组件。这可以显著提升性能,尤其是在频繁切换的场景下[^1]。 当一个被 `<keep-alive>` 缠绕的组件被激活时(即从缓存中恢复),它的 `activated` 钩子会被触发;而当它失活时(即离开当前视图并进入缓存状态),则会调用 `deactivated` 钩子[^2]。 --- #### 二、`activated` 生命周期钩子的功能 `activated` 是由 `keep-alive` 添加到组件中的特殊生命周期钩子之一。每当组件通过 `keep-alive` 被再次显示出来时,这个方法都会被执行。它可以用来处理一些需要在组件重新展示时运行的任务,比如刷新数据或者重置某些状态。 需要注意的是,在 Vue3 中,由于组合式 API 的引入,开发者也可以利用 `onActivated` 方法来实现相同的效果[^4]。 --- #### 三、代码示例 以下是关于如何在 Vue3 中使用 `keep-alive` 并定义 `activated` 钩子的具体例子: ```html <template> <div id="app"> <!-- 使用 keep-alive 包裹动态组件 --> <button @click="currentComponent = 'Home'">Go to Home</button> <button @click="currentComponent = 'About'">Go to About</button> <keep-alive> <component :is="currentComponent"></component> </keep-alive> </div> </template> <script> import { ref, onMounted } from "vue"; export default { components: { Home: () => import("./components/Home.vue"), About: () => import("./components/About.vue"), }, setup() { const currentComponent = ref("Home"); return { currentComponent }; }, }; </script> ``` 对于上述模板中的两个组件 (`Home`, `About`),可以在它们各自的 `.vue` 文件里这样写入逻辑: ```javascript // ./components/Home.vue <template> <div>Home Component</div> </template> <script> export default { name: "Home", activated() { console.log("Home component is re-activated"); }, // 当组件被重新激活时打印日志 }; </script> ``` 如果采用 Composition API,则可以用如下方式替代传统选项式的 `activated` 定义: ```javascript // ./components/About.vue (Composition API 版本) <template> <div>About Component</div> </template> <script> import { onActivated } from "vue"; export default { name: "About", setup() { onActivated(() => { console.log("About component has been re-activated!"); }); }, }; </script> ``` --- #### 四、注意事项 1. **抽象化特性** 在内部实现上,`keep-alive` 设置了 `abstract: true` 属性,这意味着 Vue 不会将其视为常规 DOM 元素的一部分,而是完全依赖于其实现细节去管理子组件的状态行为[^3]。 2. **条件性缓存控制** 开发者可以通过设置 `include` 或 `exclude` 参数来自定义哪些组件应该被缓存或排除在外。例如: ```html <keep-alive include="Home"> <component :is="view"></component> </keep-alive> ``` 3. **首次挂载 vs 后续激活** 初次加载时只会触发标准的 `mounted` 钩子,而不是 `activated`。只有之后每次返回此页面才会触发生命周期内的 `activated` 函数。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值