介绍
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挂载完成后进行页面生命周期的加载,显示。子组件挂载完毕,页面挂载完毕,最后就是页面初次渲染完成。
这时我们切换页面就会触发页面生命周期的 Hide
与 Show
。
点击子组件的按钮改变状态后控制台输出:
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
|
在页面更新函数完成前,只会触发子组件的卸载函数。