微信小程序--生命周期

目录

1、什么是生命周期

2、分类

  • 小程序应用的生命周期
  • 页面的生命周期
  • 组件的生命周期

3、三种生命周期的详解

4、页面与组件

4.1条件渲染

4.2父子组件的影响

 


 

 

1、概念

生命周期:生命周期(Life Cycle)是指一个对象从创建 -> 运行 -> 销毁的整个阶段,强调的是一个时间段。

生命周期函数:是由小程序框架提供的内置函数,会伴随着生命周期,自动按次序执行。

注意:生命周期强调的是时间段,生命周期函数强调的是时间点

2、分类

  • 小程序应用的生命周期
  • 页面的生命周期
  • 组件的生命周期

3、详解

3.1小程序应用生命周期

从小程序启动->运行->销毁的过程

app.js

App({
  //小程序初始化完成时,执行此函数,全局只触发一次。可以做一些初始化的工作。
  onLaunch: function(options) { },
  
  //小程序启动,或从后台进入前台显示时触发。
  onShow : function(options) { },
  
  //小程序从前台进入后台时触发。
  onHide : function() { }
})

补充:

 

3.2页面生命周期

小程序的页面生命周期函数需要在页面的 .js 文件中进行声明。

Page({
  //监听页面加载,一个页面只调用1次
  onLoad : function(options) { },
  //监听页面显示
  onShow : function() { },
  //监听页面初次渲染完成,一个页面只调用1次
  onRcady : function() { },
  //监听页面隐藏
  onHide: function() { },
  监听页面卸载,一个页面只调用1次
  onUnload: function() { }
})

3.3组件生命周期

组件的生命周期,指的是组件自身的一些函数,这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发。

Component({
  lifetimes: {
    attached: function() {
      // 在组件实例进入页面节点树时执行
    },
    detached: function() {
      // 在组件实例被从页面节点树移除时执行
    },
  },
  // 以下是旧式的定义方式,可以保持对 <2.2.3 版本基础库的兼容
  attached: function() {
    // 在组件实例进入页面节点树时执行
  },
  detached: function() {
    // 在组件实例被从页面节点树移除时执行
  },
  // ...
})

组件生命周期函数补充:

组件所在页面的生命周期

Component({
  pageLifetimes: {
    show: function() {
      // 页面被展示
    },
    hide: function() {
      // 页面被隐藏
    },
    resize: function(size) {
      // 页面尺寸变化
    }
  }
})

3.4页面与组件的执行过程

    • 打开小程序:(App)onLaunch --> (App)onShow --> (Pages)onLoad --> (Pages)onShow --> (pages)onRead
    • 进入下一个页面:(Pages)onHide --> (Next)onLoad --> (Next)onShow --> (Next)onReady
    • 返回上一个页面:(curr)onUnload --> (pre)onShow
    • 离开小程序:(App)onHide
    • 再次进入:小程序未销毁 --> (App)onShow(执行上面的顺序),小程序被销毁,(App)onLaunch重新开始执行.

作者:别救了这猴子废了
链接:https://juejin.cn/post/7151402790823133215
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

4、页面与组件

4.1条件渲染

组件可以通过 wx:if 和 hidden 来控制渲染的,这两种方式对生命周期的触发也有影响。

例:定义一个组件log

Component({
  lifetimes: {
    attached() {
      console.log('log attached')
    }
  }
})

使用 wx:if

<view wx:if="{{false}}"> <log /> </view>   //不会触发 attached,因此控制台没有输出。

使用 hidden

<view hidden="{{true}}"> <log /> </view>    //控制台会输出 log attached

比较:

以上两种渲染的差异在于,hidden 会正常渲染 DOM,而 wx:if 则不会渲染 DOM。

如果组件的父元素使用 hidden 进行隐藏,那么此时 createdattachedready 生命周期均会正常触发。如果在这些生命周期里获取子元素的尺寸,则所有值均返回 0。

4.2父子组件的触发顺序

    • 父组件 created
    • 子组件 created
    • 父组件 attached
    • 子组件 attached
    • 父组件 linked(触发多次,次数 = 子组件数量)
    • 子组件 linked
    • 父组件 ready
    • 子组件 ready

 

<t-cell-group>
    <t-cell title="cell1" />
    <t-cell title="cell2" />
    <t-cell title="cell3" />
 </t-cell-group>

子组件 cell 的 setData 触发次数为:1 + 2 + 3 = 6 次。

但其实开发者的预期应该是 1 次,所以 updateLastChid 应该放在父组件的 ready 方法里才符合预期

 

posted @ 2024-03-06 13:31  小那  阅读(2410)  评论(0编辑  收藏  举报