根据调试工具看Vue源码之生命周期(一)

根据调试工具看Vue源码之生命周期(一)

由于工作中经常使用chrome调试工具来定位问题,觉着这东西真的挺好用。突然有一天受到启发,想着:“我学习源码是否也可以通过调试工具呢?” 因此,诞生了这篇文章来记录我的一些学习成果,后续应该会写成一个系列。

阅读源码的一些常见方式

这里列举一些阅读源码的一些常见方式:

  1. 直接从github上查看某一个版本的源码,针对某些功能的实现进行剖析
  2. 从第一个commit开始看

上面是我所知的一些阅读源码的常见方式,但是以上两种方式,无论是哪一种,都需要对flow稍微熟悉一些,不然看着多别扭(当然啦,如果你直接下载源码到本地转码以后慢慢看,那只能当我没说);同时,从第一个commit开始看的话未免太消磨时间,相信在座的各位都不是很愿意。

那使用chrome调试工具看源码都有啥优点呢?

  1. chrome调试工具里的代码都是经过转码的,阅读成本相对较低
  2. 打下断点之后可以清晰的看到某个功能的实现步骤,跟直接阅读源码相比,不用来回切换文件夹,从而能更加集中自己的注意力

进入正题

说起Vue,首先必不可少的就是讲Vue的生命周期了,不仅是面试的时候经常会被问到这个问题,开发的时候也经常会在生命周期这里遇到一些坑

执行顺序

Vue 中常见的生命周期及对应顺序: beforeCreate —> created —> beforeMount —> mounted —> beforeDestroy —> destroyed,官网有张则很清晰的描绘了这个过程:

接下来让我们在上面对应的钩子函数里打下一个断点

我们可以发现,
beforeCreate —>
created —>
beforeMount —>
mounted 这几个钩子函数都是挨个执行的,文档诚不我欺!

但是细心的同学可以发现,beforeCreate这个钩子函数居然执行了两次!为什么?是Vue的bug吗?显然不是!

通过两次执行,我们可以看到两次vm对象是由不同的构造函数new出来的,一个是Vue,另外一个则是VueComponent 通过观察右边的调用堆栈可以发现的确是存在VueComponent这个构造函数的,具体是用来干嘛的我们先不深究。怎么去定位到这个问题呢?首先先在VueComponent这里打下一个断点,重新刷新浏览器并查看右边的调用堆栈

原来,两次beforeCreate钩子函数分别是Vue本身和VueRouter执行的(终于破案了…)

除了这几个钩子函数以外,还有beforeDestroy跟destroyed这两个钩子,顾名思义,应该是页面销毁的时候才会执行,所以我们在上面打了断点进去也没有看到这两个钩子触发了。
另外还有beforeUpdate跟updated两个钩子,字面意思就是“更新前”与“更新后”嘛。同样,上面的断点也没有在这里停下来。为了验证它们之间的执行顺序,我在这个项目里面加了几句代码:

data () {
    return {
        lists: [ 1, 2, 3, 4 ]
    }
},
methods: {
    handleClick () {
        let len = this.lists.length

        this.lists.push(this.lists[len - 1] + 1)
    }
}
复制代码

然后刷新页面,点击这个按钮可以看到执行了beforeUpdate钩子,放开这个断点以后,页面数据刷新,断点停在了updated这个钩子函数中。

最后,我们回过头来再看这张图片,是不是对整个生命周期的流程清晰多了呢?

未完待续…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101136.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ios消息推送机制_iPhone消息推送

    ios消息推送机制_iPhone消息推送原文地址:http://www.apkbus.com/android-130195-1-5.html推送是解决轮询所造成的流量消耗和电量消耗的一个比较好的解决方案,在Android上,虽然Google提供了GCM(之前为C2DM),但在国内基本等于没用,各大Android应用基本都自己架设推送Server或是使用第三方推送平台,例如新浪微博使用第三方推送平台“个推”(非广告 )。今天要

    2022年9月28日
  • zuul网关有哪些作用_springcloud注册中心

    zuul网关有哪些作用_springcloud注册中心zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个springcloud里在Eureka注册中心的模块.zuul:ignored-services:’*’sensitiveHeaders:Access-Control-Allow-Originignored-headers:Access-Control-Allow-Credentials,Access…

    2022年8月15日
  • 用JAVA写一个冒泡排序「建议收藏」

    用JAVA写一个冒泡排序「建议收藏」一:实现思想:  基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。二:实现代码:1packagebulubulu;23publicclassMaopao{4…

    2022年7月8日
  • com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 20, maxActive 20

    com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 20, maxActive 20目录异常现象异常描述解决方案注意事项异常现象com.alibaba.druid.pool.GetConnectionTimeoutException:waitmillis60000,active20,maxActive20,creating0异常描述从异常现象中com.alibaba.druid.pool.GetConnectionTimeout…

    2022年7月23日
  • 配置AAA认证和授权

    配置AAA认证和授权一、目的1、掌握AAA认证的工作原理。2、掌握使用CiscoSecureACS服务器实现AAA认证授权的方法。二、网络拓扑三、认证部分实验要求配置和测试本地和基于认证服务器的AAA认证。1、在R1上创建本地帐号,配置本地AAA认证登录console和VTY。2、配置和测试本地和基于认证服务器的AAA认证。1、在R1上创建本地帐号(用户名:A…

    2022年5月2日
  • 郑州java面试难吗_java开发人员培训机构

    郑州java面试难吗_java开发人员培训机构前言周末花了2天时间学习了额RabbitMQ,总结了最核心的知识点,带大家快速掌握RabbitMQ,整理不易希望帮忙点赞,转发,分享下,谢谢目录进入SpringBoot世界讲述Sping、SpringBoot和SpringCloud之间的关系,还重点讲述了如何利用开发工具(如IDEA)来实现开发,如何通过API文档来寻找类对象方法,告诉我们在开发过程中如何学习、发现和解决问题需要免费领取这份Alibaba架构师耗时一年整理的《SpringBoot实战,让你的开发像搭积木一样简单

    2022年9月28日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号