微信小程序 ---- 生命周期

目录

生命周期

1. 小程序运行机制

2. 小程序更新机制

3. 生命周期介绍

4. 应用级别生命周期

5. 页面级别生命周期

6. 生命周期两个细节补充说明

7. 组件生命周期

总结 


生命周期

1. 小程序运行机制

 

 

冷启动与热启动:

小程序启动可以分为两种情况,一种是冷启动,一种是热启动

冷启动:如果用户首次打开,或小程序销毁后被用户再次打开,此时小程序需要重新加载启动

热启动:如果用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时小程序并未被销毁,只是从后台状态进入前台状态

前台 以及 后台状态:

小程序启动后,界面被展示给用户,此时小程序处于「前台」状态。

当用户「关闭」小程序时,小程序并没有真正被关闭,而是进入了「后台」状态,当用户再次进入微信并打开小程序,小程序又会重新进入「前台」状态

切后台的方式包括但不限于以下几种:

  • 点击右上角胶囊按钮离开小程序
  • 安卓点击返回键离开小程序
  • 屏幕左侧右滑离开小程序

 

挂起:

小程序进入「后台」状态一段时间后(5 秒),微信停止小程序 JS 线程执行,小程序进入「挂起」状态,当开发者使用了后台播放音乐、后台地理位置等能力时,小程序可以在后台持续运行,不会进入到挂起状态

销毁:

如果用户很久没有使用小程序,或者系统资源紧张,小程序会被销毁,即完全终止运行。

当小程序进入后台并被「挂起」后,如果很长时间(目前是 30 分钟)都未再次进入前台,小程序会被销毁

当小程序占用系统资源过高,可能会被系统销毁或被微信客户端主动回收。

2. 小程序更新机制

在访问小程序时,微信会将小程序代码包缓存到本地。

开发者在发布了新的小程序版本以后,微信客户端会检查本地缓存的小程序有没有新版本,并进行小程序代码包的更新。

小程序的更新机制有两种:启动时同步更新 和 启动时异步更新

启动时异步更新

启动时同步更新:微信运行时,会定期检查最近使用的小程序是否有更新。如果有更新,下次小程序启动时会同步进行更新,更新到最新版本后再打开小程序。如果 用户长时间未使用小程序时,会强制同步检查版本更新

启动时异步更新

启动时异步更新:在启动前没有发现更新,小程序每次 冷启动 时,都会异步检查是否有更新版本。如果发现有新版本,将会异步下载新版本的代码包,将新版本的小程序在下一次冷启动进行使用,当前访问使用的依然是本地的旧版本代码

在启动时异步更新的情况下,如果开发者希望立刻进行版本更新,可以使用 wx.getUpdateManager API 进行处理。在有新版本时提示用户重启小程序更新新版本。

 

App({/*** 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)*/onLaunch: function () {const updateManager = wx.getUpdateManager()updateManager.onCheckForUpdate(function (res) {// 请求完新版本信息的回调console.log(res.hasUpdate)})updateManager.onUpdateReady(function () {wx.showModal({title: '更新提示',content: '新版本已经准备好,是否重启应用?',success(res) {if (res.confirm) {// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启updateManager.applyUpdate()}}})})updateManager.onUpdateFailed(function () {// 新版本下载失败})}})

落地代码:

 
App({// onLaunch 是小程序的钩子函数,这个钩子函数在冷启动时肯定会执行到// 当小程序冷启动时,会自动微信后台请求新版本的信息,如果有新版本,会立即进行下载onLaunch () {// 使用 wx.getUpdateManager 方法监听下载的状态const updateManager = wx.getUpdateManager()// 当下载完成新版本以后,会触发 onUpdateReady 回调函数updateManager.onUpdateReady(function () {// 在回调函数中给用户提示,wx.showModal({title: '更新提示',content: '新版本已经准备好,是否重启应用?',success(res) {if (res.confirm) {// 强制当前小程序使用新版本并且会重启当前小程序updateManager.applyUpdate()}}})})}})

3. 生命周期介绍

应用生命周期是指应用程序进程从创建到消亡的整个过程

小程序的生命周期指的是 小程序从启动到销毁的整个过程

在打开一个小程序应用的时候都需要经历一系列的初始化步骤,比如页面是否加载完成、页面是否初次渲染完成等等。

在此过程中,小程序也会运行被称为生命周期钩子的函数,这些函数由小程序框架本身提供,被称为生命周期函数,生命周期函数会按照顺序依次自动触发调用。帮助程序员在特定的时机执行特定的操作,辅助程序员完成一些比较复杂的逻辑。让开发者有机会在特定阶段运行自己的代码。

小程序的生命周期分类三类:应用级别、页面级别和组件级别 3 种类型,我们先学习应用级别和页面级别的生命周期

 

4. 应用级别生命周期

知识点:

应用生命周期通常是指一个小程序从 启动 → 运行 → 销毁的整个过程

应用生命周期伴随着一些函数,我们称为 应用生命周期函数,应用生命周期函数需要 在 app.js 文件的 App() 方法中定义

当整个小程序应用运行到某个时机的时候,我们需要做一些事情。例如:当小程序启动成功之后,我们要获取小程序的一些信息,就可以在小程序启动成功时的钩子函数中写代码获取我们想要的信息。

生命周期必填说明
onLaunch监听小程序初始化,全局只会执行 1 次
onShow监听小程序启动或切前台
onHide监听小程序切后台

 

 

📌 注意事项:

  1. 从小程序生命周期的角度来看,我们一般讲的「启动」专指冷启动,热启动一般被称为后台切前台。

  2. App() 必须在 app.js 中调用,必须调用且只能调用一次。不然会出现无法预期的后果。

小程序启动后,后台会首先完成小程序的初始化,该过程只会触发一次;之后会完成显示的工作,用户可以操作小程序从前台进入后台以及从后台回复到前台显示;小程序在后台运行一段时间,当系统资源不足时会被注销。

落地代码:

➡️ app.js

App({/*** 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)*/onLaunch: function () {// 监听小程序初始化console.log('onLaunch: 当小程序初始化完成时,会触发 onLaunch')},/*** 当小程序启动,或从后台进入前台显示,会触发 onShow*/onShow: function (options) {// 监听小程序的显示console.log('onShow: 当小程序启动,或从后台进入前台显示')},/*** 当小程序从前台进入后台,会触发 onHide*/onHide: function () {// 监听小程序的隐藏console.log('onHide: 小程序从前台进入后台')}
})

5. 页面级别生命周期

知识点:

页面生命周期就是指小程序页面从 加载 → 运行 → 销毁的整个过程

当某个页面运行到某个时机的时候,我们需要做一些事情,例如: 当某个页面加载完毕之后,需要发请求获取当前页面所需的数据,就可以在对应的页面加载完成后的钩子函数中执行发送请求的代码。

小程序中的一个页面都需要在对应页面的 .js 文件中调用 Page() 方法来注册。Page() 接受一个 Object 类型参数,其指定页面的初始数据、生命周期回调、事件处理函数等。

生命周期必填说明
onLoad页面加载时触发 (一个页面只会调用一次)
onShow页面显示时触发,页面显示/切入前台时触发
onReady页面初次渲染完成时触发(一个页面只会调用一次)
代表页面已经准备妥当,可以和视图层进行交互
onHide页面隐藏/切入后台时触发
onUnload页面卸载时触发

 

落地代码:

// pages/home/home.js
Page({// coding...// 生命周期函数--监听页面加载onLoad: function (options) {console.log('页面加载完毕')},// 生命周期函数--监听页面显示onShow: function () {console.log('监听页面显示,此时页面处于显示状态')},// 生命周期函数--监听页面初次渲染完成onReady: function () {console.log('页面初次渲染已经完成')},// 生命周期函数--监听页面隐藏onHide: function () {console.log('当前页面处于隐藏状态')},// 生命周期函数--监听页面卸载onUnload: function () {console.log('页面卸载时触发')}
})

6. 生命周期两个细节补充说明

  1. tabBar 页面之间相互切换,页面不会被销毁

  2. 点击左上角,返回上一个页面,会销毁当前页面(被打开页面)

 

7. 组件生命周期


即自定义组件的生命周期。

  • (1)created()组件实例被创建时触发
  • (2)attached()组件被添加到页面节点树中时触发
  • (3)ready()组件初次渲染完成时触发
  • (4)moved()组件被移动到新的节点位置时触发
  • (5)detached()组件被从页面节点树中移除时触发

此外,自定义组件还有一些特殊的生命周期方法:

lifetimes:用于替代原有的生命周期方法。lifetimes 中可以定义 created、attached、ready、moved、detached 等方法,它们与上述对应的生命周期方法具有相同的功能。

pageLifetimes:用于监听组件所在页面的生命周期。可以定义 show(页面展示时触发)、hide(页面隐藏时触发)等方法,这些方法可以在组件中通过 this.triggerEvent 主动触发。

Component({// 监听当前组件的生命周期lifetimes: {created() {console.log("created 组件被创建出来了");},ready() {console.log("ready 组件被附加到页面的节点树上了");},attached() {console.log("attached 组件被显示出来了");},detached() {console.log("detached 组件从页面上被移除了");},},// 监听挂载到的页面对应的生命周期pageLifetimes: {hide() {console.log("页面被隐藏了");},show() {console.log("页面显示出来了");}}
});

总结 

想一下加载一个页面(包含组件)的加载顺序,按照直觉小程序加载顺序应该是这样的加载顺序(以下列子中Component都是同步组件):

  • 首先执行 App.onLaunch -> App.onShow
  • 其次执行 Component.created -> Component.attached
  • 再执行 Page.onLoad -> Page.onShow
  • 最后 执行 Component.ready -> Page.onReady

可以看到,在页面onLoad之前会有页面create阶段,这其中就包含了组件的初始化,等组件初始化完成之后,才会执行页面的onLoad, 之后页面ready事件也是在组件ready之后才触发的。

下面我们来看看 Behavior, Behavior 与 Vue中的 mixin 类似,猜想下其中的执行顺序:

Behavior.created => Component.created

测试下来和预期相符,其实在Vue的文档中有一段这样的描述:

另外,混入对象的钩子将在组件自身钩子之前调用。

这样的设计和主流设计保持一致。接下来我们看看 pageLifetimes,有showhide生命周期对应页面的展示与隐藏,预期的执行顺序:

pageLifetime.show => Page.onShow

测试下来也和预期相符,那么我们可以推断出如下的结论:

当页面中包含组件时,组件的生命周期(包括pageLifetimes)总是优先于页面,Behaviors生命周期优先于组件的生命周期。但其实有个例外:页面退出堆栈,当页面unload时会执行如下顺序:

Page.onUnload => Component.detached

看了以上的分析你应该知道了答案,最后做个总结

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2806330.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

flutter插件开发基础教程

前言 虽然现在已经有很多插件了,但是有时候还是需要自己开发一个插件。因此打算学习一下如何开发一个插件。这里只考虑安卓,安卓使用kotlin,kotlin不会也没事,我也不会。 参考项目:https://github.com/TBoyLi/flutte…

【更换yarn的位置】解决yarn和nodejs不在同一盘下产生的某些命令应用失败问题

具体问题我记得是command fail什么error,记不太清楚了,文章主要写了如何替换yarn路径,希望可以帮助到大家。

【YOLO系列算法人员摔倒检测】

YOLO系列算法人员摔倒检测 模型和数据集下载YOLO系列算法的人员摔倒检测数据集可视化数据集图像示例: 模型和数据集下载 yolo行人跌倒检测一: 1、训练好的行人跌倒检测权重以及PR曲线,loss曲线等等,map达90%多,在行人跌…

测试需求平台7-产品管理服务接口一篇搞定

✍此系列为整理分享已完结入门搭建《TPM提测平台》系列的迭代版,拥抱Vue3.0将前端框架替换成字节最新开源的arco.design,其中约60%重构和20%新增内容,定位为从 0-1手把手实现简单的测试平台开发教程,内容将囊括基础、扩展和实战&a…

VSCode中打开md文件的智能提示

VSCode中打开md文件的智能提示 vscode中md的只能提示是默认关闭的,要打开必须要做些设置. 搜了好多文章,都是坑! 明明没设置成功,参数类型不对还信誓旦旦的坑自己同胞! 也难怪国内人学的那么难,反而国外学的很简单! 找了以下外面的资料,还是隔壁的人认真,给出了以下方法,测试成…

《TCP/IP详解 卷一》第6章 DHCP

目录 6.1 引言 6.2 DHCP 6.2.1 地址池和租用 6.2.2 DHCP和BOOTP消息格式 6.2.3 DHCP和BOOTP选项 6.2.4 DHCP协议操作 6.2.5 DHCPv6 6.2.6 DCHP中继 6.2.7 DHCP认证 6.2.8 重新配置扩展 6.2.9 快速确认 6.2.10 位置信息(LCI和LoST) 6.2.11 移…

OpenCV 4基础篇| OpenCV像素的编辑

目录 1. 前言1. 像素的访问1.1 数组索引访问1.2 img.item() 2. 像素的修改2.1 数值索引修改2.2 img.itemset() 1. 前言 像素是构成数字图像的基本单位,像素处理是图像处理的基本操作。 对像素的访问、修改,可以使用 Numpy 方法直接访问数组元素。 1. 像…

备考2024年AMC10:2000-2023年1250道AMC10真题练一练

我整理了2000-2023年的全部AMC10的AB卷真题共1250题,并且独家制作了多种在线练习,利用碎片化时间,一年足以通过自学在2024年AMC10竞赛中取得好成绩。 我们今天继续来随机看五道题目和解析。 2000-2023年AMC10真题练一练:2013年第…

洛谷P8627 [蓝桥杯 2015 省 A] 饮料换购

#先看题目 题目描述 乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊 C 型饮料,凭 3 个瓶盖可以再换一瓶 C 型饮料,并且可以一直循环下去(但不允许暂借或赊账)。 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那…

Python入门学习——基础语法

一、Python解释器 1. Python解释器的作用是&#xff1a; 将Python代码翻译成计算机认识的O和1并提交计算机执行在解释器环境内可以一行行的执行我们输入的代码也可以使用解释器程序&#xff0c;去执行".py"代码文件 2. Python解释器程序在&#xff1a; <Python…

【第七天】C++模板探秘:函数模板、类模板以及类型转换的深入解析

一、模板的概述 c面向对象编程思想&#xff1a;封装、继承、多态 c泛型编程思想&#xff1a;模板 模板的分类&#xff1a;函数模板、类模板 函数模板&#xff08;类模板&#xff09;&#xff1a;将功能相同&#xff0c;类型不同的函数&#xff08;类&#xff09;的类型抽象成虚…

QoS 服务质量

服务质量 QoS (Quality of Service) 服务质量可用若干基本性能指标来描述&#xff0c;包括&#xff1a;可用性、差错率、响应时间、吞吐量、分组丢失率、连接建立时间、故障检测和改正时间等。 服务提供者可向其用户保证某一种等级的服务质量。 服务性能的总效果&#xff0c;…

svn客户端下载、安装、使用

下载、使用 打开360软件管家&#xff0c;选怎宝库&#xff0c;搜索svn&#xff0c;点击安装 可以修改安装路径 使用 在桌面右键弹出菜单&#xff0c;点击 输入地址&#xff0c;点击ok 输入用户名、密码 &#xff0c;等待检出完成

手把手教你安装和激活Fl Studio21.2.3.4004破解补丁(附激活教程)

盼望着盼望着&#xff0c;FL Studio21带这它的版本号2.3.4004来了&#xff0c;是最新版Fl Studio21.2.3.4004 关于FL Studio21.2.3.4004破解激活&#xff0c;跟之前版本一样&#xff0c;这篇文章将给大家带来FL Studio 21.2.3.400彻底激活教程&#xff0c;喜欢的朋友欢迎一键3连…

第八篇【传奇开心果系列】python的文本和语音相互转换库技术点案例示例:Google Text-to-Speech虚拟现实(VR)沉浸式体验经典案例

传奇开心果博文系列 系列博文目录python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、雏形示例代码二、扩展思路介绍三、虚拟导游示例代码四、交互式学习示例代码五、虚拟角色对话示例代码六、辅助用户界面示例代码七、实时语音交互示例代码八、多语言支持示例代…

守护进程出现拉起多个子进程问题

引言 在我自己开发的httpApi进程中&#xff0c;使用了守护进程&#xff0c;保证进程在意外退出的时候可以重新自动启动。但是使用pstree的时候发现创建了不止一个进程&#xff0c;其中代码和问题现象如下&#xff1a; 代码 int main(int argc, char *argv[]) {printMainVer()…

计算机网络-网络层,运输层,应用层

网络层/网际层 网络层的主要任务包括&#xff1a; 提供逻辑上的端到端通信&#xff1a;网络层负责确定数据的传输路径&#xff0c;使数据能够从源主机传输到目标主机&#xff0c;即实现端到端的通信。数据包的路由和转发&#xff1a;网络层根据目标主机的地址信息&#xff0c…

MySQL事务(基础入门)(高频考点)

文章目录 前言什么是事务&#xff1f;事务的特性并发情况下会出现哪些问题脏读不可重复读幻读 总结 前言 今天来讲一讲 MySQL 事务的基础入门。 更多关于MySQL的知识可以看此专栏 MySQL专栏&#xff08;持续更新&#xff09; 什么是事务&#xff1f; 当我们在操作数据库的时…

深入探索Linux:ACL权限、特殊位与隐藏属性的奥秘

前言&#xff1a; 在Linux系统中&#xff0c;文件和目录的权限管理是一项至关重要的任务。它决定了哪些用户或用户组可以对文件或目录执行读、写或执行等操作。传统的Linux权限模型基于用户、组和其他的概念&#xff0c;但随着时间的推移&#xff0c;这种模型在某些情况下显得…

​​​​​​​Sora:OpenAI的革命性AI视频模型与其对未来影像创作的影响

随着深度学习技术和计算能力的进步&#xff0c;人工智能不仅在图像识别、自然语言处理等领域取得了卓越成就&#xff0c;同时也在不断突破视频处理和生成的边界。在这一背景下&#xff0c;OpenAI推出了Sora——一种新型的AI视频模型&#xff0c;标志着AI在视频内容创作领域的又…