两者的生命周期设计理念本质不同: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. 全局错误与异常生命周期

ArkTSVue3作用
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 渲染、组件复用、状态更新
严格性非常严格,系统直接管理生命周期相对宽松,依赖浏览器环境
最佳实践提前加载数据,及时释放资源按需渲染,减少不必要的更新

更多推荐