Vue的生命周期

每个 Vue 实例在被创建时都有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。通俗说就是 Vue 实例从创建到销毁的过程,就是生命周期。
在Vue的整个生命周期中,提供了一些生命周期钩子,给了我们执行自定义逻辑的机会。下图展示了实例的生命周期。
在这里插入图片描述

Vue生命周期可以分为8个阶段

  1. beforeCreate(创建前)
    在vue实例完全被创建出来之前(意思就是说vue实例还没有被完全创建出来)被调用,此时数据还没有被初始化,所以无法访问数据
  2. created(创建后)
    在vue实例创建完成后被调用,这个过程已完成了数据的初始化,可以被访问得到,也能获得methods方法;这个过程可以修改数据,这也是渲染之前修改数据的机会。
  3. beforeMount(载入前)
    这个过程是在模版已经在内存中编译完成,挂载之前被调用,render函数也是首次被调用,此时完成了虚拟Dom的构建,但并未被渲染,这也是最后一次修改数据的机会。
  4. mounted(载入后)
    表示内存中的模板已经渲染到页面中去,这个时候数据已经可以经过Vue的编译,该函数是实例创建的最后一个函数,此时实例已经完全创建好了,如果没有别的操作的话,此函数就静静躺在内存中,如果要使用某些插件操作页面上的DOM,最早要在mounted中操作。
  5. beforeUpdate(修改前)
    这个过程是在重新渲染之前(更新前)调用,这个过程页面中显示的数据并没有更新,但是内存中的数据已经改变,也就是说此时页面尚未和最新的数据保持同步。
  6. updated(修改后)
    这个过程在重新渲染之后(更新后调用)被调用,页面中的数据已经和内存中保持一致了,也就是说此时已经是最新的了。
  7. beforeDestroy(销毁前)
    这个过程是vue实例销毁之前被调用,在这个过程中我们可以做一些事情,比如 清除计时器或事件等等。
  8. destroyed(销毁后)
    vue实例销毁后调用,并且vue实例中所有的东西都会解绑,所有的事件监听器都会被移除,所有的子实例也会被销毁。

通过数据渲染了解Vue的生命周期的执行顺序以及什么时候执行。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>vue生命周期学习</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
        <div id="app">
            Vue的生命周期<p id="num">{{num}}</p>
        </div>
    </body>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                num: 1
            },
            beforeCreate: function() {
                console.group('------beforeCreate创建前状态------');
                console.log("页面中的num:"+document.getElementById("num").innerHTML);
                console.log("data中的message: " + this.message);//undefined
                console.log("data中的num: " + this.num)//undefined
            },
            created: function() {
                console.group('------created创建完毕状态------');
                console.log("页面中的num:"+document.getElementById("num").innerHTML);
                console.log("data中的message: " + this.message);
                console.log("data中的num: " + this.num)
            },
            beforeMount: function() {
                console.group('------beforeMount挂载前状态------');
                console.log("页面中的num:"+document.getElementById("num").innerHTML);
                console.log("data中的message: " + this.message);
                console.log("data中的num: " + this.num)
            },
            mounted: function() {
                console.group('------mounted 挂载结束状态------');
                console.log("页面中的num:"+document.getElementById("num").innerHTML);
                console.log("data中的message: " + this.message);
                console.log("data中的num: " + this.num)
            },
            beforeUpdate: function() {
                console.group('beforeUpdate 更新前状态===============》');
                console.log("页面中的num:"+document.getElementById("num").innerHTML);
                console.log("data中的message: " + this.message);
                console.log("data中的num: " + this.num)
            },
            updated: function() {
                console.group('updated 更新完成状态===============》');
                console.log("页面中的num:"+document.getElementById("num").innerHTML);
                console.log("data中的message: " + this.message);
                console.log("data中的num: " + this.num)
            },
            beforeDestroy: function() {
                console.group('beforeDestroy销毁前状态===============》');
                console.log("页面中的num:"+document.getElementById("num").innerHTML);
                console.log("data中的message: " + this.message);
                console.log("data中的num: " + this.num)
            },
            destroyed: function() {
                console.group('destroyed 销毁完成状态===============》');
                console.log("页面中的num:"+document.getElementById("num").innerHTML);
                console.log("data中的message: " + this.message);
                console.log("data中的num: " + this.num)
            }
        })
        //模拟数据发生改变
        setTimeout(() => {vm.num += 1;}, 2000);
        //模拟vm实例被销毁
        setTimeout(() => {vm.$destroy();}, 5000);
    </script>
</html>

Vue声明周期在真实场景下的业务应用:

  1. beforecreate : 可以在这加个loading事件,在加载实例时触发。
  2. created : 进行AJAX请求异步数据的获取、初始化数据。
  3. mounted : 挂载元素,获取到DOM节点。
  4. updated : 数据更新的统一业务逻辑处理。
  5. beforeDestroy : 可以做一个确认停止事件的确认框。
  6. nextTick : 更新数据后立即操作DOM。

欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位指点,在此表示感激不尽。文章持续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐小侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值