两者的生命周期设计理念本质不同:ArkTS 是面向应用 / 设备的全场景生命周期,覆盖应用启动、前后台切换、多窗口、配置变化等鸿蒙特有场景;Vue3 是面向 Web 组件的渲染生命周期,专注于 DOM 挂载、更新、卸载流程。

一、整体生命周期架构对比

层级 ArkTS(Stage 模型) Vue3(组合式 API)
应用级 Application + AbilityStage(模块级) createApp 全局实例
页面级 UIAbility + Page 组件 路由组件 + keep-alive
组件级 通用自定义组件 通用自定义组件
特殊层级 WindowStage(窗口级) 无(依赖浏览器 API)

核心差异

  • ArkTS 有4 层生命周期体系,因为鸿蒙是 "应用 - 模块 - 页面 - 组件" 的分层架构,且支持多窗口、多设备协同
  • Vue3 只有2 层生命周期体系,Web 应用的页面切换由路由实现,窗口管理由浏览器负责

二、核心生命周期钩子对应关系

1. 组件通用生命周期(最常用)

阶段 ArkTS 组件钩子 执行时机 Vue3 组合式钩子 执行时机 典型使用场景
实例创建 constructor() 组件实例化时,仅执行 1 次 setup() 组件实例化时,仅执行 1 次 初始化状态、定义响应式变量
挂载前 aboutToAppear() 组件即将挂载,build 函数执行前 onBeforeMount() 组件即将挂载,DOM 渲染前 加载初始数据、注册全局监听
渲染 build() 声明式渲染 UI,每次状态变化都会重新执行 渲染函数(模板编译生成) 首次挂载和更新时执行 声明 UI 结构,禁止写业务逻辑
挂载完成 onAppear() 组件渲染完成,已显示在屏幕上 onMounted() DOM 挂载完成,可访问 DOM 节点 获取 DOM 元素、初始化第三方库、启动动画
更新前 aboutToUpdate() 状态变化后,重新 build 前 onBeforeUpdate() 状态变化后,DOM 更新前 记录更新前的 DOM 状态
更新完成 onUpdate() 组件重新渲染完成 onUpdated() DOM 更新完成 执行更新后的 DOM 操作
卸载前 aboutToDisappear() 组件即将卸载,最后一次 build 后 onBeforeUnmount() 组件即将卸载,DOM 销毁前 注销监听、清理定时器、释放资源
卸载完成 onDisappear() 组件完全卸载,已从屏幕移除 onUnmounted() DOM 完全销毁 最终清理工作

代码示例对比

// ArkTS 组件生命周期
@Component
struct DemoComponent {
  @State count: number = 0;

  constructor() {
    console.info('组件实例创建');
  }

  aboutToAppear() {
    console.info('即将挂载,加载数据');
    this.loadData(); // ✅ 推荐在这里加载初始数据
  }

  build() {
    Column() {
      Text(`Count: ${this.count}`)
        .onClick(() => this.count++);
    }
    // ❌ 禁止在这里写异步操作、定时器
  }

  onAppear() {
    console.info('挂载完成,可操作DOM');
  }

  aboutToDisappear() {
    console.info('即将卸载,清理资源');
    clearInterval(this.timer);
  }
}
// Vue3 组件生命周期
<script setup lang="ts">
import { ref, onBeforeMount, onMounted, onBeforeUnmount } from 'vue';

const count = ref(0);
let timer: number;

console.info('组件实例创建(setup阶段)');

onBeforeMount(() => {
  console.info('即将挂载,加载数据');
  loadData();
});

onMounted(() => {
  console.info('挂载完成,可访问DOM');
  const dom = document.getElementById('demo');
});

onBeforeUnmount(() => {
  console.info('即将卸载,清理资源');
  clearInterval(timer);
});
</script>

<template>
  <div id="demo">
    <p>Count: {{ count }}</p>
    <button @click="count++">+1</button>
  </div>
</template>

三、页面级生命周期对比

1. ArkTS Page 组件特有生命周期

仅在被 Navigation 导航的 Page 组件中生效,对应鸿蒙的页面栈管理:

钩子 执行时机 对应 Vue 实现
onPageShow() 页面显示时(包括从后台切回、从其他页面返回) onActivated()(keep-alive)+ 路由守卫 afterEach
onPageHide() 页面隐藏时(包括切后台、跳转到其他页面) onDeactivated()(keep-alive)+ 路由守卫 beforeLeave
onBackPress() 按下返回键时 路由守卫 beforeRouteLeave

2. UIAbility 应用 / 页面级生命周期

UIAbility 是鸿蒙应用的入口,对应 Vue 应用的根组件 + 路由入口:

UIAbility 钩子 执行时机 对应 Vue 实现 典型用途
onCreate() Ability 首次创建,仅执行 1 次 createApp() 初始化阶段 全局状态初始化、SDK 初始化
onWindowStageCreate() 窗口创建完成 根组件 onMounted() 加载首页 loadContent()、配置窗口属性
onForeground() 应用从后台进入前台 监听 visibilitychange 事件(document.visibilityState === 'visible') 恢复动画、刷新数据、重启定时器
onBackground() 应用从前台进入后台 监听 visibilitychange 事件(document.visibilityState === 'hidden') 暂停动画、保存状态、停止不必要的网络请求
onWindowStageDestroy() 窗口销毁 根组件 onBeforeUnmount() 释放 UI 相关资源
onDestroy() Ability 完全销毁 应用卸载 / 关闭 释放所有全局资源、注销监听

关键差异

  • ArkTS 的 onForeground/onBackground系统级回调,准确可靠;Vue 依赖浏览器的 visibilitychange,存在兼容性和延迟问题
  • ArkTS 的页面切换由系统管理,生命周期钩子自动触发;Vue 的页面切换由前端路由模拟,需要手动配置路由守卫

四、模块级与应用级生命周期对比

1. ArkTS AbilityStage(模块级)

每个 HAP/HSP 模块对应一个 AbilityStage,是模块的全局入口:

钩子 执行时机 对应 Vue 实现
onCreate() 模块首次加载时 全局插件初始化(如 app.use(pinia)
onDestroy() 模块卸载时 无(Vue 应用关闭时统一销毁)
onConfigurationUpdated() 系统配置变化(语言、深浅色、屏幕方向) 监听 window.resizematchMedia 事件

2. 全局错误与异常生命周期

ArkTS Vue3 作用
onError()(Ability 级) onErrorCaptured() 捕获组件内部未处理的错误
AppStorage.on('error') app.config.errorHandler 全局错误处理

五、核心差异与使用注意事项

1. 渲染机制导致的生命周期差异

  • ArkTSbuild() 函数是纯函数,每次状态变化都会完整重新执行,因此绝对不能在 build 中写异步操作、定时器、修改状态,否则会导致无限循环和性能问题
  • Vue3setup() 仅执行 1 次,模板编译后生成高效的渲染函数,更新时只执行差异渲染,因此可以在 setup 中定义响应式变量和方法

2. 前后台生命周期的重要性

  • ArkTS:应用切后台后,系统可能会回收进程,因此必须在 onBackground() 中保存关键状态,在 onForeground() 中恢复
  • Vue3:Web 应用切后台后,浏览器通常不会立即回收进程,前后台切换的处理相对简单

3. 资源管理的严格性

  • ArkTS:鸿蒙系统对资源管理非常严格,未及时释放的监听、定时器、PixelMap 会导致内存泄漏和应用崩溃,必须在 aboutToDisappear()/onDestroy() 中彻底清理
  • Vue3:浏览器有自动垃圾回收机制,内存泄漏的影响相对较小,但仍需注意清理

4. 配置变化的处理

  • ArkTS:系统配置变化(如横竖屏切换、语言切换)会触发组件重新 build,因此需要在 onConfigurationUpdated() 中处理特殊逻辑
  • Vue3:浏览器窗口变化需要手动监听 resize 事件

六、常见面试考点对比

问题 ArkTS 答案 Vue3 答案
在哪里加载初始数据? aboutToAppear()(组件)、onWindowStageCreate()(页面) onBeforeMount()onMounted()
在哪里清理定时器? aboutToDisappear()(组件)、onBackground()/onDestroy()(应用) onBeforeUnmount()
如何监听应用切后台? onBackground()(UIAbility) 监听 visibilitychange 事件
build 函数中可以写异步操作吗? 绝对不可以,会导致重复执行和性能问题 不可以在 setup 中直接写异步操作(需用 async/await 包裹)
如何处理页面返回? onBackPress()(Page 组件) 路由守卫 beforeRouteLeave

七、总结

维度 ArkTS 生命周期 Vue3 生命周期
设计目标 适配移动 / 物联网设备的全场景应用 适配 Web 浏览器的组件化开发
覆盖范围 应用、模块、窗口、页面、组件 应用、组件
核心关注点 资源管理、前后台切换、多设备协同 DOM 渲染、组件复用、状态更新
严格性 非常严格,系统直接管理生命周期 相对宽松,依赖浏览器环境
最佳实践 提前加载数据,及时释放资源 按需渲染,减少不必要的更新
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐