uni-app 面试题:uni-app 的生命周期有哪些?与 Vue 生命周期有何区别?

在 uni-app 面试中,“生命周期”几乎是必问的考点。很多候选人能说出 Vue 的 createdmounted,却对 uni-app 的 onLoadonShowonReady 含糊不清,更说不清两者之间的区别和协作关系。本文将从应用生命周期、页面生命周期、组件生命周期三个层面梳理 uni-app 的生命周期体系,并深入对比它与 Vue 生命周期的异同,帮助你在面试中答得全面、答得准确。

一、为什么 uni-app 的生命周期不能照搬 Vue?

uni-app 是基于 Vue 的跨端框架,它既要遵循 Vue 的组件化开发模式,又要适配小程序、App、H5 等多端运行环境。小程序和原生 App 有自己的页面栈管理、前后台切换、下拉刷新等原生能力,这些能力无法通过 Vue 的组件生命周期完整表达。

因此,uni-app 在 Vue 生命周期之外,额外定义了一套应用生命周期页面生命周期,形成了“三层生命周期”并存的格局。理解这三层各自的职责和触发时机,是答好这道题的关键。

二、uni-app 的三层生命周期

1. 应用生命周期

应用生命周期定义在 App.vue 中,作用于整个应用,只在应用启动、切换前后台等全局时机触发。主要包括:

  • onLaunch:应用初始化完成时触发,全局只触发一次。常用于获取系统信息、检查更新、初始化全局数据。
  • onShow:应用启动或从后台进入前台时触发。
  • onHide:应用从前台进入后台时触发。
  • onError:应用发生脚本错误或 API 调用报错时触发,可收集错误日志。
  • onUniNViewMessageonPageNotFoundonThemeChange 等:分别用于处理 nvue 通信、页面不存在、主题变化等场景。

需要注意:应用生命周期仅在 App.vue 中生效,写在页面或组件中不会执行。

2. 页面生命周期

页面生命周期作用于每一个页面,是 uni-app 面试中考查最密集的部分。核心包括:

  • onLoad(options):页面加载时触发,一个页面只调用一次。参数为页面跳转携带的 query 参数,是获取路由参数的推荐位置。
  • onShow:页面显示时触发,每次从其他页面返回或应用回到前台都会触发。
  • onReady:页面首次渲染完成时触发,一个页面只调用一次。此时可以安全地操作 DOM 或获取节点信息。
  • onHide:页面隐藏时触发,如跳转到其他页面或应用进入后台。
  • onUnload:页面卸载时触发,如 redirectTonavigateBack 关闭页面。
  • onPullDownRefresh:下拉刷新时触发,需在 pages.json 中开启 enablePullDownRefresh
  • onReachBottom:页面滚动到底部时触发,常用于分页加载。
  • onShareAppMessageonPageScrollonResizeonTabItemTap 等:分别处理分享、滚动监听、尺寸变化、Tab 点击等场景。

3. 组件生命周期

组件生命周期与 Vue 基本一致,包括 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed。此外,uni-app 还支持 Vue 3 的 setup 组合式 API,以及 onActivatedonDeactivated 等与 keep-alive 相关的钩子。

三、与 Vue 生命周期的核心区别

区别一:生命周期层级不同

Vue 只有“组件生命周期”一层(Vue 3 增加了应用级的 onErrorCaptured 等,但体系仍以组件为主)。uni-app 则有应用、页面、组件三层,且页面生命周期是 Vue 所没有的。面试时如果只答 Vue 的钩子,会被认为不了解跨端框架的本质。

区别二:触发时机与职责不同

Vue 的 created 在实例创建后触发,mounted 在挂载后触发。uni-app 的页面中,onLoad 对应“页面加载、参数注入”,onReady 对应“首次渲染完成”,onShow 对应“页面可见”。一个常见误区是:在页面中写 mounted 也能执行,但它无法替代 onLoad 获取参数,也无法替代 onShow 感知页面重新显示。

区别三:执行顺序不同

在一个 uni-app 页面中,典型执行顺序为:

beforeCreate → created → onLoad → beforeMount → mounted → onReady → onShow

可以看到,onLoad 介于 createdbeforeMount 之间,onReadymounted 之后。理解这个顺序,对处理“数据请求放在哪里”“DOM 操作放在哪里”这类问题非常重要。

区别四:多端差异

页面生命周期在不同端的表现略有差异。例如 onReachBottom 在 H5 端需要页面内容超过一屏才触发;onPullDownRefresh 需要配置开启;nvue 页面部分钩子行为与 vue 页面不同。面试中能点出“多端差异”这一层,往往是加分项。

四、面试答题思路与常见追问

回答这道题,建议按“总—分—总”结构组织:

  1. :先说明 uni-app 生命周期分为应用、页面、组件三层,这是与 Vue 最大的结构差异。
  2. :分别列举三层的主要钩子及用途,重点讲页面生命周期的 onLoadonShowonReadyonUnload
  3. :对比与 Vue 的区别,强调层级、时机、顺序、多端四个维度。

常见追问及应对:

  • “onLoad 和 onShow 有什么区别?” onLoad 只执行一次,用于接收参数和初始化;onShow 每次页面显示都执行,适合刷新数据。
  • “onReady 和 mounted 有什么区别?” onReady 表示页面首次渲染完成,早于 mounted 之后的某些时机,且是页面级钩子;mounted 是组件级钩子。
  • “页面返回时如何刷新数据?”onShow,而不是 onLoad
  • “应用从后台回到前台,哪些钩子会触发?” 应用级 onShow 和当前页面级 onShow 都会触发。

五、总结

uni-app 的生命周期体系可以概括为“三层钩子、各司其职”:应用生命周期管全局,页面生命周期管页面栈与原生交互,组件生命周期管视图与逻辑。它与 Vue 生命周期的根本区别在于,uni-app 为了适配多端,必须在 Vue 之上补充页面级和应用级的生命周期。

面试中,不要只背钩子名称,而要讲清楚“谁在什么时候触发、用来做什么、和 Vue 的哪个钩子对应或替代”。能把执行顺序和多端差异说清楚,基本就能在这道题上拿到高分。

未经允许不得转载:任鹏个人博客 » uni-app 面试题:uni-app 的生命周期有哪些?与 Vue 生命周期有何区别?

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏