uniapp的生命周期

介绍

uni-app是一个使用Vue.js开发所有前端应用的框架。开发一次,多端使用。
本文的目的是了解生命周期函数的执行顺序,所以只会接触一部分周期函数。想了解更全面的生命周期函数请前往官方网站。

生命周期类型

uni-app 的生命周期分为三类:

  • 应用生命周期
  • 页面生命周期
  • 组件生命周期

应用生命周期

应用生命周期仅可在App.vue中监听,在其它页面监听无效。

函数名 说明
onLaunch 当uni-app 初始化完成时触发(全局只触发一次)
onShow 当 uni-app 启动,或从后台进入前台显示
onHide 当 uni-app 从前台进入后台
1
export default {
2
	onLaunch: function() {
3
		console.log('App Launch');
4
	},
5
	onShow: function() {
6
		console.log('App Show');
7
	},
8
	onHide: function() {
9
		console.log('App Hide');
10
	}
11
};

页面生命周期

函数名 说明
onLoad 监听页面加载
onShow 监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
onReady 监听页面初次渲染完成。注意如果渲染速度快,会在页面进入动画完成前触发
onHide 监听页面隐藏
onUnload 监听页面卸载

组件生命周期

uni-app 组件支持的生命周期,与vue标准组件的生命周期相同。这里没有页面级的onLoad等生命周期

函数名 说明
beforeCreate 在实例初始化之后被调用
created 在实例创建完成后被立即调用
beforeMount 在挂载开始之前被调用
mounted 挂载到实例上去之后调用
beforeUpdate 数据更新时调用,发生在虚拟 DOM 打补丁之前
updated 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子
beforeDestroy 实例销毁之前调用。在这一步,实例仍然完全可用
destroyed Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁

示例

页面代码

1
<template>
2
	<view class="container">
3
		<text>消息</text>
4
		<Child :status="status"></Child>
5
		<Child :status="status" v-if="status"></Child>
6
		<button type="default" @click="updateStatus">改变状态</button>
7
	</view>
8
</template>
9
10
<script>
11
	import Child from './child.vue';
12
	export default {
13
		components:{Child},
14
		data() {
15
			return {
16
				status:false
17
			}
18
		},
19
		onLoad() {
20
			console.log('Page Load')
21
		},
22
		onShow() {
23
			console.log('Page Show')
24
		},
25
		onReady() {
26
			console.log('Page Ready');
27
		},
28
		onHide() {
29
			console.log('Page Hide')
30
		},
31
		onUnload() {
32
			console.log('Page Unload')
33
		},
34
		beforeCreate() {
35
			console.log('Vue beforeCreate')
36
		},
37
		created() {
38
			console.log('Vue created')
39
		},
40
		beforeMount() {
41
			console.log('Vue beforeMount')
42
		},
43
		mounted() {
44
			console.log('Vue mounted')
45
		},
46
		beforeUpdate() {
47
			console.log('Vue beforeUpdate')
48
		},
49
		updated() {
50
			console.log('Vue updated')
51
		},
52
		beforeDestroy() {
53
			console.log('Vue beforeDestroy')
54
		},
55
		deactivated() {
56
			console.log('Vue deactivated')
57
		},
58
		methods:{
59
			updateStatus(){
60
				this.status = !this.status;
61
				console.log(`改变父组件status:${this.status}`)
62
			}
63
		}
64
	}
65
</script>

子组件代码

1
<template>
2
	<view class="">
3
		<text>组件生命周期</text>
4
		<button type="default" @click="updateStatus">改变状态</button>
5
	</view>
6
</template>
7
8
<script>
9
	export default{
10
		name:'Child',
11
		data(){
12
			return {
13
				childStatus:false
14
			}
15
		},
16
		props:{
17
			status:Boolean
18
		},
19
		beforeCreate() {
20
			console.log('Child Vue beforeCreate')
21
		},
22
		created() {
23
			console.log('Child Vue created')
24
		},
25
		beforeMount() {
26
			console.log('Child Vue beforeMount')
27
		},
28
		mounted() {
29
			console.log('Child Vue mounted')
30
		},
31
		beforeUpdate() {
32
			console.log('Child Vue beforeUpdate')
33
		},
34
		updated() {
35
			console.log('Child Vue updated')
36
		},
37
		beforeDestroy() {
38
			console.log('Child Vue beforeDestroy')
39
		},
40
		deactivated() {
41
			console.log('Child Vue deactivated')
42
		},
43
		methods:{
44
			updateStatus(){
45
				this.childStatus = !this.childStatus;
46
				console.log(`改变Child组件status:${this.childStatus}`)
47
			}
48
		}
49
	}
50
</script>

第一次进入页面后控制台输入:

1
App Launch  
2
App Show  
3
Vue beforeCreate  
4
Vue created  
5
Vue beforeMount  
6
Child Vue beforeCreate  
7
Child Vue created  
8
Child Vue beforeMount  
9
Page Load  
10
Page Show  
11
Child Vue mounted  
12
Vue mounted  
13
Page Ready

第一次进入时会执行应用生命周期,然后是页面的Vue挂载阶段。如果有子组件的话,进行子组件的挂载。当vue挂载完成后进行页面生命周期的加载,显示。子组件挂载完毕,页面挂载完毕,最后就是页面初次渲染完成。

这时我们切换页面就会触发页面生命周期的 HideShow

点击子组件的按钮改变状态后控制台输出:

1
改变Child组件status: true
2
Child Vue beforeUpdate
3
Child Vue updated

这里只会触发子组件Vue的更新。

点击页面的按钮改变状态后控制台输出:

1
改变父组件status: true
2
Vue beforeUpdate
3
Child Vue beforeCreate
4
Child Vue created
5
Child Vue beforeMount
6
Vue updated
7
Child Vue mounted

页面会触发更新之前的钩子函数,然后等子组件挂载。页面在触发更新完成,最后触发子组件的挂载完成函数。

再次点击页面按钮将子组件移除后控制台输出:

1
改变父组件status: false
2
Vue beforeUpdate
3
Child Vue beforeDestroy
4
Vue updated

在页面更新函数完成前,只会触发子组件的卸载函数。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!