vue 生命周期钩子函数 调用顺序问题

  1. 先开始的八个钩子函数代码省略(下方有,可以复制自己跑一下),就是简单的调用输出,

    外部代码如下
    myVue.a=1;
    myVue.$destroy();

    2.输出如下,疑问就是:

红圈内顺序我觉得 更新前-》更新完成-》销毁前-》已销毁
可是结果和我想的不一样 beforeUpdate页没有调用
图片描述

3.代码
<body>

    <div id=app>{{a}}</div>
    <script>
        var myVue = new Vue({
            el: "#app",
            data: {
                a: "Vue.js"
            },
            beforeCreate: function() {
                console.log("创建前");
            },
            created: function() {
                console.log("创建之后");
            },
            beforeMount: function() {
                console.log("mount之前")
            },
            mounted: function() {
                console.log("mount之后")
            },
            beforeUpdate: function() {
                console.log("更新前");
            },
            updated: function() {
                console.log("更新完成");
            },
            beforeDestroy: function() {
                console.log("销毁前");
            },
            destroyed: function() {
                console.log("已销毁");
            }
        });
        myVue.a = 1;
        myVue.$destroy();
    </script>
</body>
阅读 8.7k
3 个回答

去测试了下,按照题主说的去测试,确实是这个顺序。
原因:
1、数据的修改如楼上所说,是放入到一个队列中等待执行。所以赋值完毕后,去执行销毁的方法,会立刻销毁掉这个实例。触发了销毁的钩子,
clipboard.png

2、修改代码如下

clipboard.png

钩子执行顺序就是:更新前,更新,销毁前,销毁。

3、
clipboard.png
发现vm里data里面的mes 是修改成功了。但是,页面没有更新了。
clipboard.png

data改变才会触发update呀

理论上来说应该是不会输出最后一个更新完成的。调用$destory的时候会解绑所有的事件监听。
update:
vue v2.5.2的版本会多输出一个更新完成,就跟lz的一样
但是我用vue v2.0.3试了下,只输出了如下

创建前
创建之后
mount之前
mount之后
销毁前
已销毁

对比:
jsbin 2.0.3输出结果
jsbin 2.5.2输出结果
个人认为是版本更新中导致的生命周期bug

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏