一、应用生命周期高级应用
1.1 多生命周期混合调用场景
在复杂应用中,应用生命周期与页面/组件生命周期混合使用时,执行顺序如下:
-
冷启动场景:
onLaunch
→onShow
→ 首页onLoad
→ 首页onShow
→ 首页onReady
-
热启动场景(从后台切回):
onShow
→ 当前页onShow
-
页面跳转场景:
- 原页
onHide
→ 新页onLoad
→ 新页onShow
→ 新页onReady
- 原页
// 典型混合使用案例
App({
onLaunch(options) {
console.log('App Launch', options.path) // 获取启动参数
},
onShow(options) {
console.log('App Show', options.scene) // 场景值分析
}
})
1.2 特殊生命周期深度解析
- onError:可捕获应用级错误,但无法捕获Promise异常(需配合
onUnhandledRejection
) - onPageNotFound:需返回重定向路径对象
{ path: '/404', query: {}, isEntry: false }
- onThemeChange:监听系统主题变化,需在
pages.json
中配置"darkmode": true
二、页面生命周期高级特性
2.1 生命周期执行机制
-
onInit vs onLoad:
onInit
触发更早且仅执行一次,适合提前初始化数据onLoad
携带完整页面参数,适合业务逻辑初始化
-
onBackPress:
- 返回
true
可阻止默认返回行为 - 支持异步操作(需返回Promise)
- 返回
export default {
onBackPress() {
if(this.formChanged) {
return new Promise((resolve) => {
uni.showModal({
content: '是否放弃编辑?',
success: (res) => {
resolve(res.confirm)
}
})
})
}
}
}
2.2 性能优化相关生命周期
-
onReachBottom:需配合
onPageScroll
实现高性能分页加载let isLoading = false onReachBottom() { if(!isLoading) { isLoading = true this.loadMore().finally(() => isLoading = false) } }
-
onPullDownRefresh:需在
pages.json
配置"enablePullDownRefresh": true
-
onResize:响应窗口尺寸变化,常用于PC端适配
三、组件生命周期特殊场景
3.1 原生组件生命周期
- mounted:此时DOM未完全渲染完成(需使用
$nextTick
) - beforeDestroy:在uniapp中可能不会触发(推荐使用页面级
onUnload
)
3.2 自定义组件扩展生命周期
通过behaviors
实现复用逻辑:
// loading-behavior.js
export default Behavior({
pageLifetimes: {
show() {
this.startLoading()
},
hide() {
this.stopLoading()
}
}
})
四、高级面试问题示例
4.1 原理类问题
- 问:UniApp如何实现多端生命周期统一?
答:通过编译器将Vue生命周期映射到各平台原生生命周期,如小程序onLoad
对应created
,App端通过原生事件桥接实现 - 问:
onLaunch
和onShow
的options参数有何区别?
答:onLaunch
仅获取冷启动参数,onShow
可获取所有启动方式(扫码、scheme等)的参数
4.2 实战类问题
- 问:如何实现页面跳转时的数据预加载?
答:在onLoad
前使用onInit
初始化数据,或利用全局事件总线提前触发数据请求 - 问:如何处理多个页面共享的滚动位置记忆?
答:在onHide
保存滚动位置,onShow
恢复,或使用keep-alive组件(仅H5端)
五、生命周期调试技巧
5.1 性能分析工具
-
开发者工具Timeline:分析各生命周期耗时
-
自定义日志系统:
const lifeLog = [] const originPage = Page Page = function(config) { Object.keys(config).forEach(key => { if(key.startsWith('on')) { const fn = config[key] config[key] = function(...args) { const start = Date.now() fn.apply(this, args) lifeLog.push({ event: key, duration: Date.now() - start }) } } }) return originPage(config) }
5.2 常见问题解决方案
问题现象 | 可能原因 | 解决方案 |
---|---|---|
onLoad不触发 | 页面未注册或路由错误 | 检查pages.json配置 |
onShow重复执行 | 嵌套路由或自定义导航栏 | 使用状态锁控制 |
组件生命周期异常 | 原生组件限制 | 改用自定义组件或页面事件 |