一 一个实例

如果简单了解过些Vue的API的话,肯定会对一下这个特别熟悉,在上一篇里,分析了Vue的核心文件core的index.js构造vue函数执行的流程。

那么下边这个则是实例化构造函数,也就是开始使用了,不管是作为框架,还是作为插件,都需要new一下。

千呼万唤,我们把它请出来之后,发现点不同的东西,router、filter、store暂时先不表,但是这个#app是个啥东西?

翻篇回去,先看Vue的构造函数,this._init(options)是调用的第一个方法,包括传进来的参数options,不过在这之前,还判断了下调用Vue的是不是先new出来的。

二 从init方法到Vue初始化做的第一件事

根据注入的文件 找到了 init方法的文件,它是在core/instance/init.js

完整的方法如下

一开始是定义了两个属性 _uid 和_isVue

其中_uid是当前实例的唯一id,而且是递增的实例id 保证不会重复,一般会自动分配,不建议操作,当然如果需要操作的话,可以手动分配

_isVue设置为true,避免监听对象时自身被监听

然后是判断是否定义_isComponent(),这里查了下注释和代码,is_Component = true是指内部的组件实例,而initInternalCompoent()函数是作者对组件内部实例化的优化,

一般我们写的代码都会走else的分支,也就是mergeOptions() 这个方法。

接下来就遇到了第一个比较重要的点,理解mergeOptions这个方法,他定义在工具类的options这个js文件夹下。

首先想到的是为什么要进行策略对象的合并,而且是init的第一步,简单的说,Vue在处理选项的时候,使用了这个策略对象把父子选项进行合并,并将最终的值赋值给实例下

的$options,更直白的说就是把vue实例上原有的属性和传入的option以及继承和构造的所有属性进行递归式的合并,确保一个vue实例是有一个$options.

先说下这个options,当我们new一个vue的实例时,可以传一些数据,比如上面new的函数那样,从前边看,vue的实例在实例化后会加载很多其他的东西,例如生命周期钩子、render函数等等。

而手动传入的这个对象,就叫做options,也是上面vm.$options中传入的第二个参数,关于vm.$options,是一个贯穿整个源码的属性,可以单独拆出来讲,但是为了文章的完整性,先简单说一下,不然后边的这个合并策略对象就会云里雾里。

这是mergeOptions()执行的流程

这函数涉及到了很多复杂的合并策略,包括钩子函数、props、methods、inject\computed、directives、filter、data,为了轻松的走完整个流程,这里不展开

更具体的流程如下:

三 一个嵌套的三元表达式

看这些复杂的合并代码有点脑壳疼,作者还特别秀的写了个嵌套的三元表达式,他长这样。

总结一下Vue的初始化:Vue的初始化主要就干了这么几件事:合并配置、初始化生命周期、初始化事件和渲染逻辑、初始化data做数据劫持,这种把不同的功能和逻辑部分

拆分成一个个单独的模块,使得Vue的核心加载过程一目了然,这种编程思想是十分值得借鉴的。

vue源码阅读(二)的更多相关文章

  1. Vue源码分析(二) : Vue实例挂载

    Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...

  2. 手牵手,从零学习Vue源码 系列二(变化侦测篇)

    系列文章: 手牵手,从零学习Vue源码 系列一(前言-目录篇) 手牵手,从零学习Vue源码 系列二(变化侦测篇) 陆续更新中... 预计八月中旬更新完毕. 1 概述 Vue最大的特点之一就是数据驱动视 ...

  3. Vue源码学习二 ———— Vue原型对象包装

    Vue原型对象的包装 在Vue官网直接通过 script 标签导入的 Vue包是 umd模块的形式.在使用前都通过 new Vue({}).记录一下 Vue构造函数的包装. 在 src/core/in ...

  4. vue源码阅读(一)

    版本:2.5.17-beta.0 核心模块(src/core):包括组件.全局API.vue实例.对象属性监测系统.公共方法.虚拟dom.配置等模块 src/core/index.js import ...

  5. Vue源码阅读一:说说vue.nextTick实现

    用法: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 疑惑: 怎么实现的延迟回调 原理: JavaScript语言的一大特点就是单线程,同一个时 ...

  6. xxl-job源码阅读二(服务端)

    1.源码入口 xxl-job-admin是一个简单的springboot工程,简单翻看源码,可以很快发现XxlJobAdminConfig入口. @Override public void after ...

  7. Spring 源码阅读 二

    程序入口: 接着上一篇博客中看完了在AnnotationConfigApplicationContext的构造函数中的register(annotatedClasses);将我们传递进来的主配置类添加 ...

  8. vue源码阅读笔记

    1.yarn test [文件名]  -t [name-of-spec(describe or test )] 直接运行yarn test,会测试所有测试文件:yarn test 后面只跟文件名的话会 ...

  9. Vue源码学习(二)$mount() 后的做的事(1)

    Vue实例初始化完成后,启动加载($mount)模块数据. (一)Vue$3.protype.$mount             标红的函数 compileToFunctions 过于复杂,主要是生 ...

随机推荐

  1. 【Git】原Git库拆分子目录作为新仓库,并保留log记录

    一.需求描述: 现有一个git仓库,Team A和Team B的人操作同一仓库的不同目录,Team A的dev希望Team B的dev没有权限review属于Team A的代码目录,故现需要先将这个g ...

  2. 微信小程序把玩(三十七)location API

    原文:微信小程序把玩(三十七)location API location API也就分这里分两种wx.getLocation(object)获取当前位置和wx.openLocation(object) ...

  3. C# 泛型 无法将类型xx隐式转换为“T”

    原文:C# 泛型 无法将类型xx隐式转换为“T” 直接奖泛型转为T是不能转换的 要先转Object 例: public static T GetValue<T>(string inValu ...

  4. Android零基础入门第55节:ImageSwitcher和TextSwitcher使用

    原文:Android零基础入门第55节:ImageSwitcher和TextSwitcher使用 上一期我们了解了ViewAnimator组件和ViewSwitcher组件的使用,你都掌握了吗?本期一 ...

  5. ACL 我为什么要发明一个轮子?

    现在成熟的开发库与开发框架有很多,所以平时我们在开发自己的应用程序时一般直接拿来用就可以了,所以当我先是开发出 C 语言版的 acl 框架库时有人认为是这个轮子是否值得发明,而当我再开发出基于 acl ...

  6. Lamda一行代码实现"36选7"随机自动选号

    南粤风采36选7是广东的一种彩票玩法.非常简单的从1-36个数字选7个. 今天在同事面前炫耀了一把,只用一行Lamda代码实现随机自动选号 Enumerable.Range(, ).Select(x ...

  7. spring boot自定义配置文件

    把一些可能会经常变动的东西写在配置文件中,可以增加程序的灵活性,避免多次改版发版. 在sping boot中除了自带的默认配置文件application.properties之外,我们还可以在reso ...

  8. 使用Gson封装和解析JSON

    案例:判断用户名是否存在 在jsp页面使用ajax $("#username").change(function(){ var username = $(this).val(); ...

  9. 你所忽略的,覆盖equals时需要注意的事项《effective java》

    我们都知道Object的equals的比较其实就是==的比较,其实是内存中的存放地址的比较.正常逻辑上:类的每个实例本质上都是唯一的. 在工作中我们实际的业务逻辑往往有可能出现一些相对特殊的需求需要对 ...

  10. 记一次腾讯IEG面试失败经历

    如果这是一次成功的经历,估计浏览量不会低.无奈本人能力有限,而且一直在实习,准备时间与面试经验有限导致此次失败,不过,失败也是一种宝贵的经验,我希望也相信这里能给大家一些比较珍贵的经验,废话不多说,上 ...