keep-alive与activated、deactivated

本文详细解析了Vue.js中keep-alive组件的使用方法及其对组件状态的保持作用,阐述了如何利用activated和deactivated生命周期钩子进行组件的激活与停用处理,以提高应用性能。
keep-alive与activated
keep-alive

使用<component v-bind:is="currentTabComponent"></component>来切换不同的组件时,有时会想保持这些组件的状态,以避免反复重渲染导致的性能问题。这时就可以用 元素将其动态组件包裹起来。

<keep-alive>
  <component v-bind:is="currentTabComponent"></component>
</keep-alive>

包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。当组件在 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。

activated:在vue对象存活的情况下,进入当前存在activated()函数的页面时,一切到改页面就触发。

有的时候我们的页面在每次切换时需要重新请求数据。当第一次切换到组件A时,组件A的created、mounted、activated生命周期函数都会被执行,但是页面切换是不会触发created、mounted的,这时就需要使用activated。在切换到组件B,这时组件A的deactivated的生命周期函数会被触发;在切换回组件A,组件A的activated生命周期函数会被触发。

deactivated

当离开组件A,切到组件B之前,需要对组件A做某些处理,比如清除定时器,这时就需要使用deactivated。

参考:
https://blog.youkuaiyun.com/qq_36608921/article/details/82216617
https://www.cnblogs.com/xjy20170907/p/11388334.html
https://cn.vuejs.org/v2/api/#keep-alive

### 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` 函数。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值