当前位置: 首页 > news >正文

【小程序 - 大智慧】深入微信小程序的渲染周期

5.png


目录

  • 前言
  • 应用生命周期
  • 页面的生命周期
  • 组件的生命周期
  • 渲染顺序
  • 页面路由
  • 运行机制
  • 更新机制
    • 同步更新
    • 异步更新


前言

VueReact 框架一样,微信小程序框架也存在生命周期,实质也是一堆会在特定时期执行的函数。

小程序中,生命周期主要分成了三部分:

  • 应用的生命周期
  • 页面的生命周期
  • 组件的生命周期
  • 在微信小程序第一次渲染结束后,利用 setData 修改数据不会导致生命周期变化(与 VUE 不同)
  • 只有当 路由发生改变,及页面跳转才会涉及到相关的生命周期改变

应用生命周期

属性说明
onLaunch小程序初始化 - 全局只触发一次
onShow监听小程序显示,从后台切回前台
onHide小程序切回后台
onError错误监听函数
onPageNotFound页面不存在监听函数
onUnhandledRejection未处理的 Promise reject 函数
onThemeChange系统主题变化函数

页面的生命周期

属性说明
onLoad页面加载时触发,可以获取页面参数(options),进行初始化操作
onShow监听页面显示,页面从后台切回前台
onReady页面渲染完成,可以进行DOM/动画操作(执行一次)
onHide页面隐藏/切回后台
onUnload页面卸载,当前页面栈出栈触发
onRouteDone路由动画完成

组件的生命周期

属性说明
created组件创建时执行,不能调用 setData
attached页面显示,可进行初始化操作
ready页面渲染完成,可以进行DOM/动画操作(执行一次)
moved组件实例被移动到另一位置
detached组件被卸载
error组件方法出错
show组件所在的页面被展示,在 Page onShow 前
hide组件所在的页面被隐藏在,Page onHide 前
resize组件所在的页面尺寸变化
routeDone组件所在的页面路由动画完成

组件自身生命周期在 lifetimes 定义,组件所在页面的生命周期由 pageLifetimes 定义。

渲染顺序

  • 应用 App 页面 Page 组件 Component

  • 进入:onLaunch(App) => onShow(App)

  • 初始化:created(Component)=> attached(Component)=> onLoad(Page)=> show(Component)=> onShow(Page)=> ready(Component)=> onReady(Page)

  • 页面隐藏:使用 pageLifetimes hide show 展示

  • 页面卸载:onUnload(Page)=> detached(B)

子组件先初始化,后卸载

页面路由

页面路由 | 微信开放文档

运行机制

小程序运行机制 | 微信开放文档

在这里插入图片描述

冷启动:首次打开/销毁后打开,小程序需要重新进行加载

热启动:后台切前台,即小程序还存在手机的任务管理器中

小程序运行机制中,需要注意的特性如下:

  1. 挂起状态,停止逻辑线程的执行,内存数据被保存,事件和接口回调会在下一次进入前台触发
  2. 30分钟挂起被销毁,占用资源过高被系统/微信客户端销毁
  3. 小程序被销毁前,可以利用 页面回调函数 onSaveExitState保存页面数据状态

更新机制

小程序更新机制 | 微信开放文档

开发者在管理后台发布新版本的小程序之后,微信客户端会有若干个时机去检查本地缓存的小程序有没有新版本,并进行小程序的代码包更新。但如果用户本地有小程序的历史版本,此时打开的可能还是旧版本。

同步更新

  1. 微信运行时,定期检查小程序是否有更新,如果存在,更新到最新版本后再打开小程序
  2. 若用户处于弱网环境、下载最新版本失败等情况下,仍会启动本地的较低版本

异步更新

  1. 小程序每次冷启动 会检查更新版本,发现新版本后,将会异步下载新版本的代码包。但本次启动仍会使用客户端本地的旧版本代码,即新版本的小程序需要等 下一次冷启动**** 才会使用。
  2. 如果发现本次更新的版本,可以利用代码强制更新
const updateVersion = () => {if (!wx.canIUse('getUpdateManager')) {return}const updateManager = wx.getUpdateManager()// 版本信息检查updateManager.onCheckForUpdate((res) => {console.log('版本信息', res)})// 新版本更新updateManager.onUpdateReady((res) => {console.log('准备更新版本', res)wx.showModal({title: '更新提示',content: '新版本已经准备好,是否重启应用?',success(res) {if (res.confirm) {// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启updateManager.applyUpdate()}}})})// 新版本下载失败updateManager.onUpdateFailed((err) => {console.log('新版本下载失败', err)})
}export default updateVersion
http://www.lryc.cn/news/441938.html

相关文章:

  • 《深入了解 Linux 操作系统》
  • 批评他人也需要技术
  • 安装SQL Server遇到的问题
  • java项目之编程训练系统源码(springboot)
  • MySQL的登陆错误:ERROR 1049 (42000): Unknown database ‘root‘
  • vue使用vue-i18n实现国际化
  • 微信小程序如何设置左侧导航栏跟随页面滑动
  • 个人小结(2.0)
  • 探索自动化的魔法:Python中的pyautogui库
  • YOLOv9改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计
  • EasyExcel的基本使用——Java导入Excel数据
  • Apache Iceberg 试用
  • 速通汇编(六)认识栈,SS、SP寄存器,push和pop指令的作用
  • 【Python机器学习】NLP信息提取——值得提取的信息
  • 代理IP批理检测工具,支持socks5,socks4,http和https代理批量检测是否可用
  • AI视觉算法盒是什么?如何智能化升级网络摄像机,守护全方位安全
  • 【Vue】VueRouter路由
  • idea多模块启动
  • 23:SPI二:W25Q64存储器模块的使用
  • 论文解读《COMMA: Co-articulated Multi-Modal Learning》
  • 10款电脑加密软件超好用推荐|2024年常用电脑加密软件排行榜
  • 用户态缓存:环形缓冲区(Ring Buffer)
  • Harmony应用 ArkTs AES 加密方法之GCM对称加密
  • 热成像在战场上的具体作用!!!
  • 2024年09月20日《每日一练》
  • 使用 SSCB 保护现代高压直流系统的优势
  • Linux基础命令——文件系统的日常管理
  • uniapp使用高德地图设置marker标记点,后续根据接口数据改变某个marker标记点,动态更新
  • 坦白了,因为这个我直接爱上了 FreeBuds 6i
  • 006.MySQL_查询数据