vue生命周期的四个阶段

文章发布于 2023-05-12

vue的生命周期包含四个阶段,执行顺序分别为

    1. 初始化
    1. 挂载
    1. 更新
    1. 销毁

vue生命周期包含四个阶段,每个阶段有前后两个钩子函数,共计8个钩子函数。

初始化前(beforeCreate)、初始化后(created)

挂载前(beforeMount)、挂载后(mounted)

更新前(beforeUpdate)、更新后(updated)

销毁前(beforeDestroy)、销毁后 (destroyed)

生命周期图示

初始化

  • beforeCreate:实例初始化完成、props 解析之后、data()computed 等选项处理之前立即调用

  • created:可以响应式数据、计算属性、方法和侦听器。然而,此时挂载阶段还未开始,因此 $el 属性仍不可用。

<template>
    <div ref="h">
        {{loading}}
    </div>
</template>

export default {
    name:'',
    props:{
        listData:{
            type:Object
        }
    },
    data(){
        return {
            loading:false
        }
    },
    //初始化钩子函数
    beforeCreated(){
        // 该钩子函数会在data()之前调用,所以无法获取到data()内的数据。
        console.log(this.loading)
        
        // 该钩子函数可以获取到父组件传递的数据,通过this.$props获取父组件数据
        console.log(this.$props.listData) 
    }
    created(){
        // 初始化钩子函数中,进行初始化数据
        this.loading = true
        console.log(this.$refs.h) //此时还没挂载,无法获取到dom h的对象
    }

}

挂载

挂载DOM前/后调用。

<template>
    <div ref="h">
        {{loading}}
    </div>
</template>
export default {
    name:'',
    props:{},
    data(){
        return {
            loading:false
        }
    },
    //DOM创建之前调用
    beforeMounted(){
        //该钩子函数会在挂载dom之前调用,获取不到dom
        console.log(this.$refs.h)
    }
    
    
    //DOM创建之后调用
    mounted(){
        // 初始化钩子函数中,进行初始化数据
        this.loading = true
        //该钩子函数会在挂载dom之后调用,可以获取到dom
        console.log(this.$refs.h)
    }

}

更新

组件的响应式状态变更,而更新其 DOM 树之前/后调用。

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.7.10/vue.js"></script>
</head>
<body>
    <div id="app">
        <full></full>
    </div>
    
    <template id="full">
        <div >
          这里是子组件
          <p ref="p">{{number}}</p>  
          <button @click="add"> 新增</button>
        </div>
    </template>

    <script>

        Vue.component('full' ,{
            template:'#full',
            data(){
                return{
                    number:1
                }
            },
            methods:{
                add(){
                    this.number++
                }
            },
            
            //在DOM更新之前调用
            beforeUpdate(){
                console.log(this.number)
                debugger
            },
            updated(){
                // console.log(this.number)
                // debugger
            }
        })
        new Vue({}).$mount('#app')
    </script>
</body>
</html>

效果图

当点击新增之后,数据立即做了更新,但是DOM还没有被更新。也就说明 beforeUpdate 是在更新DOM之前调用。上面完整代码可供拷贝参考。

销毁

组件销毁前/后调用。例如销毁组件的定时器

export default {
    name:'',
    props:{},
    data(){
        return {
            loading:false,
            data:[]
        }
    },
    
    created(){
        this.timer = setInterval(()=>{
            //轮询数据
            this.getData()
        },1000)
    },
    
    methods:{
        getData(){ //初始化数据
            axios.get(...).then(res=>{
                this.data = res.data
            })
        }
    },
    
    //实例在销毁之后调用
    destroyed(){
        // 初始化钩子函数中,进行初始化数据
        clearInterval(this.timer)
    }

}