1. 程式人生 > 實用技巧 >uni-app 應用生命週期

uni-app 應用生命週期

uni-app支援如下應用生命週期函式:

函式名說明
onLaunch uni-app初始化完成時觸發(全域性只觸發一次)
onShow uni-app啟動,或從後臺進入前臺顯示
onHide uni-app從前臺進入後臺
onError uni-app報錯時觸發
onUniNViewMessage nvue頁面傳送的資料進行監聽,可參考nvue 向 vue 通訊
onUnhandledRejection 對未處理的 Promise 拒絕事件監聽函式(2.8.1+)
onPageNotFound 頁面不存在監聽函式
onThemeChange 監聽系統主題變化

注意

示例程式碼

<script>
    // 只能在App.vue裡監聽應用的生命週期
    export default {
        onLaunch: function() {
            console.log('App Launch')
        },
        onShow: function() {
            console.log(
'App Show') }, onHide: function() { console.log('App Hide') } } </script>

頁面生命週期

uni-app支援如下頁面生命週期函式:

函式名說明平臺差異說明最低版本
onLoad 監聽頁面載入,其引數為上個頁面傳遞的資料,引數型別為Object(用於頁面傳參),參考示例
onShow 監聽頁面顯示。頁面每次出現在螢幕上都觸發,包括從下級頁面點返回露出當前頁面
onReady 監聽頁面初次渲染完成。注意如果渲染速度快,會在頁面進入動畫完成前觸發
onHide 監聽頁面隱藏
onUnload 監聽頁面解除安裝
onResize 監聽視窗尺寸變化 App、微信小程式
onPullDownRefresh 監聽使用者下拉動作,一般用於下拉重新整理,參考示例
onReachBottom 頁面滾動到底部的事件(不是scroll-view滾到底),常用於下拉下一頁資料。具體見下方注意事項
onTabItemTap 點選 tab 時觸發,引數為Object,具體見下方注意事項 微信小程式、支付寶小程式、百度小程式、H5、App(自定義元件模式)
onShareAppMessage 使用者點選右上角分享 微信小程式、百度小程式、位元組跳動小程式、支付寶小程式
onPageScroll 監聽頁面滾動,引數為Object nvue暫不支援
onNavigationBarButtonTap 監聽原生標題欄按鈕點選事件,引數為Object App、H5
onBackPress 監聽頁面返回,返回 event = {from:backbutton、 navigateBack} ,backbutton 表示來源是左上角返回按鈕或 android 返回鍵;navigateBack表示來源是 uni.navigateBack ;詳細說明及使用:onBackPress 詳解。支付寶小程式只有真機能觸發,只能監聽非navigateBack引起的返回,不可阻止預設行為。 app、H5、支付寶小程式
onNavigationBarSearchInputChanged 監聽原生標題欄搜尋輸入框輸入內容變化事件 App、H5 1.6.0
onNavigationBarSearchInputConfirmed 監聽原生標題欄搜尋輸入框搜尋事件,使用者點選軟鍵盤上的“搜尋”按鈕時觸發。 App、H5 1.6.0
onNavigationBarSearchInputClicked 監聽原生標題欄搜尋輸入框點選事件 App、H5 1.6.0
onShareTimeline 監聽使用者點選右上角轉發到朋友圈 微信小程式 2.8.1+
onAddToFavorites 監聽使用者點選右上角收藏 微信小程式 2.8.1+

onReachBottom使用注意 可在pages.json裡定義具體頁面底部的觸發距離onReachBottomDistance,比如設為50,那麼滾動頁面到距離底部50px時,就會觸發onReachBottom事件。

如使用scroll-view導致頁面沒有滾動,則觸底事件不會被觸發。scroll-view滾動到底部的事件請參考scroll-view的文件

onPageScroll(監聽滾動、滾動監聽、滾動事件)引數說明:

屬性型別說明
scrollTop Number 頁面在垂直方向已滾動的距離(單位px)

注意

  • onPageScroll裡不要寫互動複雜的js,比如頻繁修改頁面。因為這個生命週期是在渲染層觸發的,在非h5端,js是在邏輯層執行的,兩層之間通訊是有損耗的。如果在滾動過程中,頻發觸發兩層之間的資料交換,可能會造成卡頓。
  • 如果想實現滾動時標題欄透明漸變,在App和H5下,可在pages.json中配置titleNView下的type為transparent,參考
  • 如果需要滾動吸頂固定某些元素,推薦使用css的粘性佈局,參考外掛市場。外掛市場也有其他js實現的吸頂外掛,但效能不佳,需要時可自行搜尋。
  • 在App、微信小程式、H5中,也可以使用wxs監聽滾動,參考;在app-nvue中,可以使用bindingx監聽滾動,參考
  • onBackPress上不可使用async,會導致無法阻止預設返回
onPageScroll : function(e) { //nvue暫不支援滾動監聽,可用bindingx代替
    console.log("滾動距離為:" + e.scrollTop);
},

onTabItemTap返回的json物件說明:

屬性型別說明
index String 被點選tabItem的序號,從0開始
pagePath String 被點選tabItem的頁面路徑
text String 被點選tabItem的按鈕文字

注意

  • onTabItemTap常用於點選當前tabitem,滾動或重新整理當前頁面。如果是點選不同的tabitem,一定會觸發頁面切換。
  • 如果想在App端實現點選某個tabitem不跳轉頁面,不能使用onTabItemTap,可以使用plus.nativeObj.view放一個區塊蓋住原先的tabitem,並攔截點選事件。
  • 支付寶小程式平臺onTabItemTap表現為點選非當前tabitem後觸發,因此不能用於實現點選返回頂部這種操作
onTabItemTap : function(e) {
    console.log(e);
    // e的返回格式為json物件: {"index":0,"text":"首頁","pagePath":"pages/index/index"}
},

onNavigationBarButtonTap引數說明:

屬性型別說明
index Number 原生標題欄按鈕陣列的下標
onNavigationBarButtonTap : function (e) {
    console.log(e);
    // e的返回格式為json物件:{"text":"測試","index":0}
}

onBackPress回撥引數物件說明:

屬性型別說明
from String 觸發返回行為的來源:'backbutton'——左上角導航欄按鈕及安卓返回鍵;'navigateBack'——uni.navigateBack() 方法。支付寶小程式端不支援返回此欄位
export default {
    data() {
        return {};
    },
    onBackPress(options) {
        console.log('from:' + options.from)
    }
}

注意

  • nvue 頁面weex編譯模式支援的生命週期同weex,具體參考:weex生命週期介紹
  • 支付寶小程式真機可以監聽到非navigateBack引發的返回事件(使用小程式開發工具時不會觸發onBackPress),不可以阻止預設返回行為

元件生命週期

uni-app元件支援的生命週期,與vue標準組件的生命週期相同。這裡沒有頁面級的onLoad等生命週期:

函式名說明平臺差異說明最低版本
beforeCreate 在例項初始化之後被呼叫。詳見
created 在例項建立完成後被立即呼叫。詳見
beforeMount 在掛載開始之前被呼叫。詳見
mounted 掛載到例項上去之後呼叫。詳見注意:此處並不能確定子元件被全部掛載,如果需要子元件完全掛載之後在執行操作可以使用$nextTickVue官方文件
beforeUpdate 資料更新時呼叫,發生在虛擬 DOM 打補丁之前。詳見 僅H5平臺支援
updated 由於資料更改導致的虛擬 DOM 重新渲染和打補丁,在這之後會呼叫該鉤子。詳見 僅H5平臺支援
beforeDestroy 例項銷燬之前呼叫。在這一步,例項仍然完全可用。詳見
destroyed Vue 例項銷燬後呼叫。呼叫後,Vue 例項指示的所有東西都會解繫結,所有的事件監聽器會被移除,所有的子例項也會被銷燬。詳見