Vue的生命周期

生命周期图示

大家,只需要知道红色矩形框中的内容就行,即:所谓的钩子函数,其他部分是vue内部帮我们完成的,我们不能控制,而钩子函数就是vue给开发人员提供的口子来在整个生命周期中局部控制vue的某些行为。

beforeCreate

该钩子函数是在实例化vue的data数据和methods方法之前调用的,此时在该钩子函数中,不能获取到vue实例中的data和methods。

created

此时,vue已经实例化了data和methods

beforeMount

挂载vm之前,此时,不能获取到dom中的class对象等。

mounted

已经挂载vm,可以通过dom来获取class对象等。

beforeUpdate

更新data数据,dom对象之前

updated

更新data数据,dom对象之后

beforeDestroy

销毁vue实例之前,一般用于组件的销毁

destroyed

销毁vue实例之后


生命周期的演示

验证钩子函数的执行顺序

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
</head>
<body>

<div id="app">
    <span>{{msg}}</span>
</div>
</body>
</html>

<script>

    let app = new Vue({
        el: '#app',
        data: {
            msg: 'hello Vue!'
        },
        beforeCreate: function () {
            console.log('beforeCreate')
        },
        created:function(){
            console.log('created')
        },
        beforeMount:function(){
            console.log('beforeMount')
        },
        mounted:function(){
            console.log('mounted')
        },
        beforeUpdate:function(){
            console.log('beforeUpdate')
        },
        updated:function(){
            console.log('updated')
        },
        beforeDestroy:function(){
            console.log('updated')
        },
        destroyed:function(){
            console.log('updated')
        },
        methods: {
            checkTest() {
            }
        }
    })
</script>

说明:从图中可以观察到,控制台输出的顺序就是我们理解的生命周期的顺序,从beforeCreate开始的哈~~~


现在,在控制台,修改msg的值看看:

验证钩子函数的功能

修改钩子函数的输出语句:

        beforeCreate: function () {
            console.log('beforeCreate')
            console.log('beforeCreate:'+this)
            console.log('beforeCreate:'+this.msg)
            console.log('beforeCreate:'+this.checkTest)
        }

        created:function(){
            console.log('created')
            console.log(this)
            console.log('created:'+this.msg)
            console.log('created:'+this.checkTest)
        }

        beforeMount:function(){
            console.log('beforeMount')
            let msgClass = document.querySelector('.msgClass')
            console.log(msgClass)
        },
        mounted:function(){
            console.log('mounted')
            let msgClass = document.querySelector('.msgClass')
            console.log(msgClass)
        }

可以看到,beforeMount中,data中的数据是没有被渲染出来的,而mounted中已经成功讲vue中的data数据渲染出来了。


组件的基本用法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
</head>
<body>

<div id="app">
    <hello-com></hello-com>
</div>
</body>
</html>

<script>

    //Vue中全局注册:组件,即:注册后,在Vue的实例中都能使用
    Vue.component('hello-com', {
        template: '<h1>{{comMsg}}</h1>',
        data: function () {
            return {
                comMsg: '组件的信息'
            }
        }
    })

    let app = new Vue({
        el: '#app',
        data: {
            msg: 'hello Vue!'
        }
    })
</script>

组件渲染成功啦~~~

说明:大家这里,应该看到了,在组件中,定义data时,我这里使用了函数来返回data数据,因为组件是可以反复复用的,如果不返回一个新的对象的话,大家共用一个data对象就会出现数据问题了


使用组件来验证销毁钩子函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
</head>
<body>

<div id="app">
    <hello-com v-if="isIf" ></hello-com>
    <button @click="isIf = !isIf">isIF</button>
    <hello-com v-show="isShow" ></hello-com>
    <button @click="isShow = !isShow">isShow</button>
</div>
</body>
</html>

<script>

    //Vue中全局注册:组件,即:注册后,在Vue的实例中都能使用
    Vue.component('hello-com', {
        template: '<h1>{{comMsg}}</h1>',
        data: function () {
            return {
                comMsg: '组件的信息'
            }
        }
    })
    let app = new Vue({
        el: '#app',
        data: {
            msg: 'hello Vue!',
            isIf: true,
            isShow: true
        },
        beforeCreate: function () {
            console.log('beforeCreate')
        },
        created:function(){
            console.log('created')
        },
        beforeMount:function(){
            console.log('beforeMount')
        },
        mounted:function(){
            console.log('mounted')
        },
        beforeUpdate:function(){
            console.log('beforeUpdate')
        },
        updated:function(){
            console.log('updated')
        },
        beforeDestroy:function(){
            console.log('beforeDestroy')
        },
        destroyed:function(){
            console.log('destroyed')
        }
    })
</script>

在页面点击,两个button来验证销毁钩子函数:

在vue2.0之前,点击isIf按钮后,会在销毁组件时,调用beforeDestroy 和 destroyed函数,再次点击isIF按钮时,会调用:beforeCreate、created、beforeMount、mounted。

现在,我测试,v-if 和 v-show已经是相同的效果了,都只是出现:beforeUpdate 和 updated 函数。不知道是vue已经优化这块功能,还是我姿势不对,么有弄出来~~~


  转载请注明: 解忧杂货店 Vue的生命周期

  目录