生命周期函数

192 阅读4分钟

什么是生命周期函数

生命周期函数也称为钩子函数,Vue组件对象在创建到销毁的过程中,在某一种条件成立的时刻,系统会调用的Vue中设定的函数。

组件中的8个生命周期函数

当前Vue组件在创建到销毁的过程中会调用的函数:beforeCreate() {}、created() {}、beforeMount() {}、mounted() {}、beforeUpdate() {}、 updated() {}、 beforeDestroy() {}、destroyed() {}

    <div id="app">

    </div>
    <script>
        new Vue({
            el:"#app",
            data:{
                msg:"hello"
            },
            methods: {
                fn(){}
            },
            beforeCreate() {
                console.log("beforeCreate",this.msg,this.fn,111)
            },
            created() {
                console.log("created",this.msg,this.fn);
            },
            beforeMount() {
                console.log("beforeMount")
            },
            mounted() {
                console.log("motuned");
            },
            beforeUpdate() {
                console.log("beforeUpdate")
            },
            updated() {
                console.log("Update")
            },
            beforeDestroy() {
             console.log("beforeDestroy",this.msg)
            },
            destroyed() {

            },
        });
    </script>

beforeCreate() {}

该函数运行是在当前Vue实例创建完成前不是在创建前,这个函数运行时表示当前Vue实例正在创建中比如劫持data和methods等,也就是此时this对象中还不能访问到数据,该函数中也不能操作this对象。

  • 问题1:能否进行网络请求
    • 能做网路请求,因为这是函数在运行时所以XMLHttpRequest对象是可以访问然后做AJAX请求
  • 问题2:能否网络请求数据然后设置到数据源中
    • 不能设置到数据源中,因为this对象当前的Vue实例还在创建中
  • 问题3:这个钩子函数在项目中干什么
    • 只要不是运用到网页页面渲染的网络请求比如预加载工具,预加载图片,第三方工具的预加载

预加载:利用网页中同源加载的优化(同源加载优化是同一个页面中同样的img,第三方脚本等src属性请求资源时只会请求第一次)

created() {}

该函数运行是在当前Vue实例创建完毕后,但是还没有将当前Vue实例挂载到DOM树中,该函数可以操作this对象但是还不能操作DOM

  • 问题1:能否进行网络请求
    • 能做网路请求,因为这是函数在运行时所以XMLHttpRequest对象是可以访问然后做AJAX请求
  • 问题2:能否网络请求数据然后设置到数据源中
    • 能设置到数据源中,因为this对象当前的Vue实例已经创建完毕
  • 问题3:这个钩子函数在项目中干什么
    • 请求首页的数据,此时页面并没有全部加载完成,同时做网络请求数据。

beforeMount() {}

该函数运行是在当前Vue实例创建完毕后挂载到DOM树中之前,表示当前Vue实例正在挂载到DOM树中,该函数可以操作this对象但是不能操作DOM。

  • 这个钩子函数在项目中干什么
    • 用于渲染前的操作,该函数可以操作this对象但是不能操作DOM

mounted() {}

该函数运行是在当前Vue实例已经挂载到页面了,该函数可以操作this对象可以操作DOM,类似于window.onload。

  • 这个钩子函数在项目中干什么
    • 用于请求首页数据,页面已经全部加载出来了,用户可以看到整个页面的结构再做网络请求数据。

beforeUpdate() {}

该函数运行是在数据源已经更新了,页面重新渲染前并不是数据更新前,页面首次渲染不会触发

updated() {}

该函数运行是在页面已经重新渲染了

beforeUpdate和Update这两个函数中不能网络请求新数据去更新数据源,会导致进入死循环因为数据源发生改变就会刷新页面,但是如果请求的数据是和之前一样的就不会刷新页面

beforeDestroy() {}

该函数运行是在当前Vue实例销毁之前

  • 这个钩子函数在项目中干什么
    • this对象还在可以做最后的操作,可以保存用户的行为配置文件比如播放器的进度等

destroyed() {}

该函数运行是在当前Vue实例销毁完毕,表示当前Vue实例不能再操作页面,当前Vue实例已经不再关联页面的元素,但是页面上的静态模板不会销毁。在该函数中无法操作this组件对象已被销毁,但是可以操作浏览器的window对象,页面上的静态模板并没有销毁。

  • 这个钩子函数在项目中干什么
    • 可以把当前组件中计时器清除了,可以把body的滚动条滚动到顶部等操作window对象的一些功能

销毁VM对象的方法:第1个关闭浏览器,第2个官方提供的方法this.$destroy(),第3个

一些注意点

this.$el 是当前组件的真实DOM,它在要在mounted之后才能访问

Vue 实例的 data 属性,在created,beforeMount, mounted ,beforeUpdate ,updated ,beforeDestroy中能访问

页面首次加载过程中,会依次触发beforeCreate,created,beforeMount,mounted钩子函数