小程序——生命周期

server/2024/11/13 15:54:27/

文章目录

  • 运行机制
  • 更新机制
  • 生命周期介绍
  • 应用级别生命周期
  • 页面级别生命周期
  • 组件生命周期
  • 生命周期两个细节补充说明
  • 总结

运行机制

用一张图简要概述一下小程序的运行机制
在这里插入图片描述
冷启动与热启动:

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

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

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

前台 以及 后台状态:

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

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

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

挂起:

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

销毁:

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

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

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

更新机制

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

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

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

启动时异步更新

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

启动时异步更新

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

在启动时异步更新的情况下,如果开发者希望立刻进行版本更新,可以使用 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.js
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 种类型

在这里插入图片描述

应用级别生命周期

知识点:

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

应用生命周期伴随着一些函数,我们称为 应用生命周期函数,应用生命周期函数需要 在 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: 小程序从前台进入后台')}
})

页面级别生命周期

知识点:

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

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

小程序中的一个页面都需要在对应页面的 .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('页面卸载时触发')}
})

组件生命周期

组件的生命周期,指的是组件自身的一些函数,这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发。
组件的生命周期函数需要在 lifetimes 字段内进行声明

最重要的生命周期是 created attached detached 包含一个组件生命周期流程的最主要时间点

  • 组件实例刚刚被创建好时, created 生命周期被触发。此时,组件数据 this.data 就是在 Component构造器中定义的数据 data 。 此时还不能调用 setData 。 通常情况下,这个生命周期只应该用于给组件 this添加一些自定义属性字段。
  • 在组件完全初始化完毕,进入页面节点树后, attached 生命周期被触发。此时, this.data
    已被初始化为组件的当前值。这个生命周期很有用,绝大多数初始化工作可以在这个时机进行。
  • 在组件离开页面节点树后, detached 生命周期被触发。退出一个页面时,如果组件还在页面节点树中,则 detached 会被触发
  • 在这里插入图片描述

代码:

javascript">Component({lifetimes: {created: function () {// 在组件实例刚刚被创建时执行,注意此时不能调用 setData // 一般用来为组件添加一些自定义属性字段。},attached: function() {// 在组件实例进入页面节点树时执行},detached: function() {// 在组件实例被从页面节点树移除时执行},},// 以下是旧式的定义方式,可以保持对 <2.2.3 版本基础库的兼容attached: function() {// 在组件实例进入页面节点树时执行},detached: function() {// 在组件实例被从页面节点树移除时执行},// ...
})
生命周期必填说明
created在组件实例刚刚被创建时执行
attached在组件实例进入页面节点树时执行
ready在组件在视图层布局完成后执行
moved在组件实例被移动到节点树另一个位置时执行
detached在组件实例被从页面节点树移除时执行

组件还有一些特殊的生命周期,这类生命周期和组件没有很强的关联

主要用于组件内部监听父组件的展示、隐藏状态,从而方便组件内部执行一些业务逻辑的处理

组件所在页面的生命周期有 4 个: show、 hide、 resize、 routeDone,需要在 pageLifetimes 字段内进行声明
在这里插入图片描述

javascript">Component({// coding...// 组件所在页面的生命周期pageLifetimes: {// 监听组件所在的页面展示(后台切前台)状态show () {console.log('组件所在的页面被展示')},// 监听组件所在的页面隐藏(前台切后台、点击 tabBar)状态hide () {console.log('组件所在的页面被隐藏')}}})

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

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

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

总结

小程序冷启动,钩子函数执行的顺序

在这里插入图片描述
保留当前页面(navigate) 以及 关闭当前页面(redirect)

在这里插入图片描述

切后台 以及 切前台(热启动)
在这里插入图片描述


http://www.ppmy.cn/server/119825.html

相关文章

react 组件通讯

组件通讯 组件是独立且封闭的单元&#xff0c;默认情况下&#xff0c;只能使用组件自己的数据。在组件化过程中&#xff0c;我们将一个完整的功能拆分成多个组件&#xff0c;以更好的完成整个应用的功能。而在这个过程中&#xff0c;多个组件之间不可避免的要共享某些数据。为…

Isaac Sim 跑Slam学习过程2024.9.20

# 本文随着时间逐渐增加内容&#xff0c;是学习笔记 # 诶怎么今天Isaac Sim 4.2.0 突然出现了&#xff0c;这哪来的时间再去试试新的.... 没有大佬带...自己学吧 希望使用仿真环境跑定位Slam&#xff0c;现在IMU在Isaac Sim中有现成的传感器模块&#xff0c;GPS则没有&am…

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL18

实现3-8译码器① 描述 下表是74HC138译码器的功能表. E3 E2_n E1_n A2 A1 A0 Y0_n Y1_n Y2_n Y3_n Y4_n Y5_n Y6_n Y7_n x 1 x x x x 1 1 1 1 1 1 1 1 x x 1 x x x 1 1 1 1 1 1 1 1 0 x x x x x 1 1 1 1 1 1 1 1 1 …

Windows10、CentOS Stream9 环境下安装kafka_2.12-3.6.2记录

目录 Windows下操作1. 安装kafka [kafka_2.12-3.6.2](https://downloads.apache.org/kafka/3.6.2/kafka_2.12-3.6.2.tgz)2. 启动Zookeeper2.1 进入Kafka的config目录&#xff0c;修改zookeeper.properties配置文件 3. 启动kafka3.1 进入Kafka的config目录&#xff0c;修改serve…

C语言循环学习

作为初学者&#xff0c;学习C语言中的循环结构是非常重要的&#xff0c;它们能让你轻松地重复执行代码。在C语言中&#xff0c;常用的循环结构主要有for循环和while循环。我们将从基本概念开始&#xff0c;逐步讲解如何使用这两种循环&#xff0c;并通过示例帮助你理解和练习。…

解决ubuntu22.04 gnome-terminal 无法启动的问题

22.04下面默认的python 版本是3.10. 如果你安装了3.8或其它版本&#xff0c;尽量不要去ln -s python3.8 python3修改默认python3版本&#xff0c;不然Terminal会打不开。猜测Terminal可能用到了python的_gi这个库。 可以在xterm或putty远程连上&#xff0c;输入 sudo gnome-te…

96 kHz、24bit 立体声音频ADC芯片GC5358描述

概述&#xff1a; GC5358 是一款高性能、宽采样率、立体声音频模数转换器。其采样率范围是8KHz~96KHz&#xff0c;非常适合从消费级到专业级的音频应用系统。单端模拟输入不需要外围器件。GC5358 音频有两种数据格式&#xff1a;MSB对齐和 I2S 格式&#xff0c;和各种如 DTV、D…

98-策略模式的理解

‌策略模式是一种软件设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换。这种模式允许算法的变化不会影响使用算法的客户端&#xff0c;通过将使用算法的责任和算法的实现分割开来&#xff0c;并委派给不同的对象对这些…