vue生命周期

172 阅读2分钟

vue生命周期分为三个阶段,分别是:创建-执行-销毁,并且是从上向下按顺序执行

一、钩子函数

创建阶段(beforeCreate、created、beforeMount、mounted)
执行阶段(beforeUpdate、updated)
销毁阶段(beforeDestroy、Destroy)

二、使用时机

2.1 创建阶段(整个实例声明只执行一次)

beforeCreate:创建VUE实例前的钩子函数,此时组件的props/data/methods尚未被创建,处于不可用状态。

<template>
    <div id = "myapp">
        <p>{{ index }}</p>
        <button @click="add">+</button>
    </div>
</template>
<script>
export default {
    data() {
        return {
            index: 0
        }
    },
    methods: {
        add() {
            this.index += 1
        }
    },
    beforeCreate() {
        console.log('创建前状态')
        console.log(this.$el)  //undefined
        console.log(this.$data)  //undefined
        console.log(this.index)  //undefined
        const res = document.querySelector('#myapp')
        console.log(res.innerHTML)  //报错,还读不到innerHTML
    }
}
</script>

created: 实例创建完成之后的钩子函数,组件的props/data/methods已经创建好,处于可用的状态,但组件的模板结构尚未生成。此时还在内存中在此调用methods中方法,请求服务器中数据,并把请求数据转到data中,供template模板渲染使用。最早获取数据的钩子函数,进行Ajax请求异步数据获取,初始化数据。loading,异步,页面最快渲染 1366*1450

    created() {
        console.log('创建后状态')
        console.log(this.$el)   //undefined
        console.log(this.$data)   //object
        console.log(this.index)  //0
        const res = document.querySelector('#myapp')
        console.log(res.innerHTML)  //报错,还读不到innerHTML
    },

beforeMount: 开始挂载编译生成的HTML到对应位置时触发的钩子函数。但此时还未将编译出的HTML渲染到页面上。

    beforeMount() {
        console.log('载入前状态')
        console.log(this.$el)   //undefined
        console.log(this.$data)   //object
        console.log(this.index)  //0
        const res = document.querySelector('#myapp')
        console.log(res.innerHTML)  //报错,还读不到innerHTML
    }

mounted:将编译好的HTML挂载到页面完成后的执行钩子函数,也是最早操作DOM的钩子函数。

    mounted() {
        console.log('载入后状态')
        console.log(this.$el)  //<div id="myapp">...</div>
        console.log(this.$data)   //object
        console.log(this.index)  //0
        const res = document.querySelector('#myapp')
        console.log(res.innerHTML)   //<p>0</p><button>+</button>
    }

2.2 执行阶段(整个实例声明执行0-N次)

beforeUpdate: 重新渲染组件模板结构组件运行阶段,页面结构此时还未跟上,下面p标签内。keep-alive
Update: updated执行时,页面和data数据已经保持同步,都是最新的

    beforeUpdate() {
        console.log('更新前状态')
        console.log(this.$el)      //<div id="myapp">...</div>
        console.log(this.$data)    //object
        console.log(this.index)    //1
        const res = document.querySelector('#myapp')
        console.log(res.innerHTML)  //<p>0</p><button>+</button>
    },
    updated() {
        console.log('更新后状态')
        console.log(this.$el)      //<div id="myapp">...</div>
        console.log(this.$data)   //object
        console.log(this.index)    //1
        const res = document.querySelector('#myapp')
        console.log(res.innerHTML)  //<p>1</p><button>+</button>
    }

2.3 销毁阶段(整个实例声明只执行一次)

beforeDestroy:此时组见中所有data、methods、以及过滤器,指令等,都处于可用状态,此时还未真正执行销毁过程
destroyed: 当执行销毁了函数时,组件已经被完全销毁,此时组建中所有数据、方法、以及过滤器,指令等,都已经不可用了

    beforeDestroy() {
        console.log('更新前状态')
        console.log(this.$el)      //<div id="myapp">...</div>
        console.log(this.$data)    //object
        console.log(this.index)    //1
        const res = document.querySelector('#myapp')
        console.log(res.innerHTML)  //<p>0</p><button>+</button>
    },
    destroyed() {
        console.log('更新后状态')
        console.log(this.$el)      //<div id="myapp">...</div>
        console.log(this.$data)   //object
        console.log(this.index)    //1
        const res = document.querySelector('#myapp')
        console.log(res.innerHTML)  //<p>0</p><button>+</button>
    }

三、遇到的问题

  1. 其他同事经常用到setup(),setup()是vue3里的,但我们项目是vue2,vue3兼容vue2,setup()于生命周期函数 beforeCreate 和 Created 两个钩子函数之间的函数。setup函数中是无法使用data 和 methods中的数据和方法的,最后都是需要return出去的,不然无法再模板中使用。setup函数只能是同步的不能是异步的