uni-app生命周期

uni-app的生命周期包括:应用生命周期、页面生命周期、组件生命周期

一、应用生命周期(只能在App.vue文件中监听)

函数 说明
onLaunch 初始化完成时触发(全局只触发一次)
onShow 启动时或从后台进入前台显示
onHide 从前台进入后台
onError 报错时触发
onPageNotFound 页面不存在监听函数

在App.vue文件中打印

复制代码
<script>
	export default {
		onLaunch: function() {
			console.log('App Launch')
		},
		onShow: function() {
			console.log('App Show')
		},
		onHide: function() {
			console.log('App Hide')
		}
	}
</script>

在控制台输出可以看到执行顺序

二、页面声明周期

函数 说明
onLoad 监听页面加载,其参数为上个页面传递的数据,参数类型为 Object
onShow 监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
onReady 监听页面初次渲染完成
onHide 监听页面隐藏
onUnload 监听页面卸载
onResize 监听窗口尺寸变化
onPullDownRefresh 监听用户下拉动作,一般用于下拉刷新
onReachBottom 页面滚动到底部的事件(不是scroll-view滚到底),常用于下拉下一页数据。具体官方文档注意事项
onPageScroll 监听页面滚动,参数为Object
onShareAppMessage 用户点击右上角分享
onShareTimeline 监听用户点击右上角转发到朋友圈
onAddToFavorites 监听用户点击右上角收藏

更多页面生命周期细节,详见官方文档

在page页面中打印

在控制台输出可以看到执行顺序

三、组件生命周期(同Vue组件生命周期)

函数 说明
beforeCreate 实例初始化之前调用
created 创建完成后立即调用
beforeMount 挂载前调用
mounted 挂载后调用
beforeUpdate 数据更新时调用
updated 数据更新重新渲染
beforeDestroy 实例销毁之前调用
destroyed 实例销毁之后调用

H5和微信小程序的生命周期函数调用顺序不一致

H5

复制代码
page beforeCreate
page onLoad
page onShow
page created
page beforeMount

component beforeCreate
component created
component beforeMount
component mounted

page onReady
page mounted

微信小程序

复制代码
page beforeCreate
page created
page beforeMount

component beforeCreate
component created
component beforeMount

page onLoad
page onShow

component mounted

page mounted
page onReady

一般情况下,主要使用的周期函数如下,他们的执行顺序是固定的

复制代码
page onLoad

component mounted

page mounted

测试代码

页面

复制代码
<template>
  <view class="page-container">
    <TestComponent></TestComponent>
  </view>
</template>

<script lang="ts">
// @ts-nocheck
import Vue from 'vue'
import type { PropType } from 'vue'
import TestComponent from './components/TestComponent.vue'

export default Vue.extend({
  components: {
    TestComponent,
  },

  props: {},

  data() {
    return {}
  },

  // 监听页面初始化,其参数同 onLoad 参数,为上个页面传递的数据,参数类型为 Object(用于页面传参),触发时机早于 onLoad
  onInit() {
    console.log('page onInit')
  },

  // 监听页面加载,其参数为上个页面传递的数据,参数类型为 Object(用于页面传参)
  onLoad() {
    console.log('page onLoad')
  },

  // 监听页面卸载
  onUnload() {
    console.log('page onUnload')
  },

  // 监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
  onShow() {
    console.log('page onShow')
  },

  // 监听页面隐藏
  onHide() {
    console.log('page onHide')
  },

  // 监听页面初次渲染完成。注意如果渲染速度快,会在页面进入动画完成前触发
  onReady() {
    console.log('page onReady')
  },

  // 监听窗口尺寸变化
  onResize() {
    console.log('page onResize')
  },

  // 监听用户下拉动作,一般用于下拉刷新
  onPullDownRefresh() {
    console.log('page onPullDownRefresh')
  },

  // 页面滚动到底部的事件(不是scroll-view滚到底),常用于下拉下一页数据。具体见下方注意事项
  onReachBottom() {
    console.log('page onReachBottom')
  },

  // 用户点击右上角分享
  onTabItemTap() {
    console.log('page onTabItemTap')
  },

  // 用户点击右上角分享
  onShareAppMessage() {
    console.log('page onShareAppMessage')
  },

  // 监听页面滚动,参数为Object
  onPageScroll() {
    console.log('page onPageScroll')
  },

  // 监听原生标题栏按钮点击事件,参数为Object
  onNavigationBarButtonTap() {
    console.log('page onNavigationBarButtonTap')
  },

  // 监听页面返回,返回 event = {from:backbutton、 navigateBack} ,backbutton 表示来源是左上角返回按钮或 android 返回键;navigateBack表示来源是 uni.navigateBack ;
  onBackPress() {
    console.log('page onBackPress')
  },

  // 监听原生标题栏搜索输入框输入内容变化事件
  onNavigationBarSearchInputChanged() {
    console.log('page onNavigationBarSearchInputChanged')
  },

  // 监听原生标题栏搜索输入框搜索事件,用户点击软键盘上的"搜索"按钮时触发。
  onNavigationBarSearchInputConfirmed() {
    console.log('page onNavigationBarSearchInputConfirmed')
  },

  // 监听原生标题栏搜索输入框点击事件(pages.json 中的 searchInput 配置 disabled 为 true 时才会触发)
  onNavigationBarSearchInputClicked() {
    console.log('page onNavigationBarSearchInputClicked')
  },

  // 监听用户点击右上角转发到朋友圈
  onShareTimeline() {
    console.log('page onShareTimeline')
  },

  // 监听用户点击右上角收藏
  onAddToFavorites() {
    console.log('page onAddToFavorites')
  },

  // 在实例初始化之前被调用
  beforeCreate() {
    console.log('page beforeCreate')
  },

  // 在实例创建完成后被立即调用
  created() {
    console.log('page created')
  },

  // 在挂载开始之前被调用
  beforeMount() {
    console.log('page beforeMount')
  },

  // 挂载到实例上去之后调用注意:此处并不能确定子组件被全部挂载,如果需要子组件完全挂载之后在执行操作可以使用$nextTickVue官方文档
  mounted() {
    console.log('page mounted')
  },

  // 数据更新时调用,发生在虚拟 DOM 打补丁之前。详见  仅H5平台支持
  beforeUpdate() {
    console.log('page beforeUpdate')
  },

  // 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。详见  仅H5平台支持
  updated() {
    console.log('page updated')
  },

  // 实例销毁之前调用。在这一步,实例仍然完全可用。详见
  beforeDestroy() {
    console.log('page beforeDestroy')
  },

  // Vue 实例销毁后调用。调用后,Vue  实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
  destroyed() {
    console.log('page destroyed')
  },

  methods: {},
})
</script>

<style></style>

组件 components/TestComponent.vue

复制代码
<template>
  <view class="component-container">component</view>
</template>

<script lang="ts">
// @ts-nocheck
import Vue from 'vue'
import type { PropType } from 'vue'

export default Vue.extend({
  components: {},

  props: {},

  data() {
    return {}
  },

  // 在实例初始化之前被调用
  beforeCreate() {
    console.log('component beforeCreate')
  },

  // 在实例创建完成后被立即调用
  created() {
    console.log('component created')
  },

  // 在挂载开始之前被调用
  beforeMount() {
    console.log('component beforeMount')
  },

  // 挂载到实例上去之后调用注意:此处并不能确定子组件被全部挂载,如果需要子组件完全挂载之后在执行操作可以使用$nextTickVue官方文档
  mounted() {
    console.log('component mounted')
  },

  // 数据更新时调用,发生在虚拟 DOM 打补丁之前。详见  仅H5平台支持
  beforeUpdate() {
    console.log('component beforeUpdate')
  },

  // 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。详见  仅H5平台支持
  updated() {
    console.log('component updated')
  },

  // 实例销毁之前调用。在这一步,实例仍然完全可用。详见
  beforeDestroy() {
    console.log('component beforeDestroy')
  },

  // Vue 实例销毁后调用。调用后,Vue  实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
  destroyed() {
    console.log('component destroyed')
  },

  methods: {},
})
</script>

<style></style>
相关推荐
不会敲代码11 小时前
手写 Zustand:三十分钟带你搞懂状态管理库的核心原理
前端·javascript·源码
神奇的程序员1 小时前
重构了自己5年前写的截图插件
前端·javascript·架构
橙淮1 小时前
从优化到安全再到未来 ——JavaScript 全维度技术指南
javascript
UXbot3 小时前
一人独立交付 UI + 前端:AI 驱动 UI 设计工具的五大功能模块深度评测
前端·低代码·ui·设计模式·交互
kobesdu3 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
诚实可靠王大锤3 小时前
React Native 输入框与按钮焦点冲突解决方案(rn版本0.70.3)
前端·javascript·react native·react.js
kyriewen3 小时前
测试妹子让我写单测,我偷偷用AI一天干完一周的活
前端·chatgpt·cursor
2601_957780843 小时前
Claude Code 2026年最新部署指南:从环境搭建到技能扩展
前端·人工智能·ai编程·claude
zhangfeng11334 小时前
workbuddy 专家 “前端开发师” 结合nvidia-mistral-small-4-119b-2603 项目计划-前端界面开发.md
前端·人工智能·免费
IT_陈寒6 小时前
为什么Java的Stream并行处理反而变慢了?
前端·人工智能·后端