Vue.js 源码学习笔记 -- 分析前准备 待续

主体

  实例方法归类:

    data     数据方法
    dom     dom方法
    event    事件处理
    lifecycl   生命周期函数

    init 初始化vue页面

  全局方法:

    derectives filters

init过程

data : observer deps computed watch

|| watcher

template: fragment [ directive repeat if component transition filter ]

重点:

把数据(Model) 和视图(View) 建立关联

1. 通过observer 对 data 监听, 包括监听data 任何属性变化

2. 把 template 解析成一段 文档对象, 然后解析其中的directive,

  得到每一个指令所依赖的东西 [包括 数据, 和这个数据更新到页面的原始方法 ]

  比如 v-text=‘mess‘ 被解析后

  1. 所依赖的数据项 this.$data.mess data1
  2. 响应视图的更新方法 span.textContent = this.$data.mess fn1

3. 通过 watcher 把上述的两部分结合起来, 即把 directive中的依赖 对应 observer;

  这样有数据更新, 就会触发observer, 如果发现数据 data1 有变化,

  就会通知指令 触发 fn1更新视图

整个vm 核心, 就是实现了 observer(观察数据变化)  parser(解析依赖)  watcher(观察到的数据通知指令的执行更新相应页面方法) 这三个东西

具体实现

  

数据监听机制

如何监听某一个对象属性的变化呢?我们很容易想到 Object.defineProperty 这个 API,

为此属性设计一个特殊的 getter/setter,然后在 setter 里触发一个函数,就可以达到监听的效果。

[ ‘push‘, ‘pop‘, ‘shift‘, ‘unshift‘, splice‘, ‘sort‘, ‘reverse‘].forEach(function( method){

  var original = arrayProto[method] // Array.prototype.sort

  //数组的方法执行的时候, 会触发下面这个函数
  _.define( arrayMethods, method, function mutator(){

	//先在原生的数组原型方法中按传入的参数执行一遍, 得到结果
	var result = original.apply(this , args);

	var ob = this.__ob__;

	var inserted 

	switch (method){
		case ‘push‘: inserted = args ;break
		case ‘unshift‘: inserted = args ; break
		case ‘splice‘: inserted = args.slice(2);

	}
	//不解
	if(inserted) ob.observeArray(inserted) 

	ob.notify()

	return result

  })

})

  

同时 Vue.js 提供了两个额外的“糖方法”  arr.$set[0] = "c"  和 $remove(index) 来弥补这方面限制带来的不便。

个人理解是把这$set 和 $remove 添加到数组原型中,

因为defineproperty可以监听到数组所有原型方法, 包括用户新增的原型方法

所以用户调用$set 的时候, 会被劫持到

path 解析器

var path = ‘a.b[1].v‘
var obj = {
a: { b:[ {v:1}, {v:2}, {v:3} ] }
}

parse( obj, path ) // => 2

如何解析 这个字符串 成为 js语句 是关键

vue.js 是通过状态机管理 来实现对路径的解析的

时间: 2024-10-12 15:47:26

Vue.js 源码学习笔记 -- 分析前准备 待续的相关文章

vue.js源码学习分享(一)

今天看了vue.js源码  发现非常不错,想一边看一遍写博客和大家分享 /** * Convert a value to a string that is actually rendered. *转换一个值为字符串 */ function _toString (val) { return val == null? '': typeof val === 'object'? JSON.stringify(val, null, 2): String(val)//如果该值是null则返回空字符串,如果该

Vue.js 源码学习之Flag篇

The Progressive JavaScript Framework --vuejs.org 起因 第一次接触 Vue.js 是因为要做一个通讯录的外包项目,这个项目要有前台展示和中后台管理,从轮子做起肯定是不明智的选择,所以当时初步定下的是 Vue.js + Element UI 的技术栈. 项目过程很漫长,因为给的钱实在是可有可无,权当是学习了. 项目的接口是交给了同学. 整个项目采用的是钱后端分离的开发模式,我做我的页面,他做他的接口. 项目出了两个版本,做的时候,中间就强行的看文档.

vue.js源码学习分享(九)

/* */ var arrayKeys = Object.getOwnPropertyNames(arrayMethods);//获取arrayMethods的属性名称 /** * By default, when a reactive property is set, the new value is//默认情况下,当一个响应的属性被设置,新的值也转换成响应的.然而当经过向下支撑时,我们不想促使转换,因为这值也许是一个嵌套值在一个冻结的数据结构,转换它时将会失去最优化 * also conve

vue.js源码学习分享(五)

//配置项var config = { /** * Option merge strategies (used in core/util/options)//选项合并策略 */ optionMergeStrategies: Object.create(null), /** * Whether to suppress warnings.//是否抑制警告 */ silent: false, /** * Show production mode//生产模式 tip message on boot?//

vue.js源码学习分享(二)

/** * Check if value is primitive//检查该值是否是个原始值 */ function isPrimitive (value) { return typeof value === 'string' || typeof value === 'number' } /** * Create a cached version of a pure function.//创建一个纯粹的函数的缓存版本 */ function cached (fn) { var cache = O

Java集合源码学习笔记(二)ArrayList分析

Java集合源码学习笔记(二)ArrayList分析 >>关于ArrayList ArrayList直接继承AbstractList,实现了List. RandomAccess.Cloneable.Serializable接口,为什么叫"ArrayList",因为ArrayList内部是用一个数组存储元素值,相当于一个可变大小的数组,也就是动态数组. (1)继承和实现继承了AbstractList,实现了List:ArrayList是一个数组队列,提供了相关的添加.删除.修

jQuery源码学习笔记:扩展工具函数

// 扩展工具函数 jQuery.extend({ // http://www.w3school.com.cn/jquery/core_noconflict.asp // 释放$的 jQuery 控制权 // 许多 JavaScript 库使用 $ 作为函数或变量名,jQuery 也一样. // 在 jQuery 中,$ 仅仅是 jQuery 的别名,因此即使不使用 $ 也能保证所有功能性. // 假如我们需要使用 jQuery 之外的另一 JavaScript 库,我们可以通过调用 $.noC

MVVM大比拼之vue.js源码精析

VUE 源码分析 简介 Vue 是 MVVM 框架中的新贵,如果我没记错的话作者应该毕业不久,现在在google.vue 如作者自己所说,在api设计上受到了很多来自knockout.angularjs等大牌框架影响,但作者相信 vue 在性能.易用性方面是有优势.同时也自己做了和其它框架的性能对比,在这里.今天以版本 0.10.4 为准 入口 Vue 的入口也很直白: ? 1 var demo = new Vue({ el: '#demo', data: { message: 'Hello V

Hadoop源码学习笔记(6)——从ls命令一路解剖

Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命令,这是一个列出分面式文件系统中的目录结构.传入一个查阅地址,如果没有则是根目录.启动NameNode和DataNode服务.然后在命令行中输入ls : 换成程序,如果写呢,我们新建一个ClientEnter类.之前章节中,我们就知道,在命令行中输入的dfs命令,指向到org.apache.hado