vue源码相关log...

1、响应式处理

let vm = new Vue({
     data() {
        return {
            name:'张三',
            age: 18,
            info:{  c: 'xxx' }
        }
     }
})

vue对传入得options挂载到vm上,执行initState(),总的初始化函数,初始化顺序为props、methods、data、computed、watch。

执行proxy方法,将_data上的数据代理到vm上,方便this.xxx访问。

observe(data),核心方法,递归遍历对象,通过defineReactive方法对对象属性的get、set进行拦截


image.png
问题 为什么对象数组分开处理

因为对象的属性一般不对太多,递归劫持完全是可行的,但是数组的个数不确定,如果太多(成千上万)每一个都去劫持get、set会影响性能。
所以对象deineProperty劫持,数组用变异方法去处理

遗留问题

对象的新增key 删除key 监听不到
数组只能通过变异方法去操作能触发响应式,arr[1]=xxx 不行,操作length也不行

2、模板渲染
查找options选项是否有el,没有再去$mount挂载,有el则为根节点
查找options是否有render函数,没有再去找template模板,再没有再去获取el的outHtml,最后都会转换成render函数

通过将template转换成render函数,也就是compileToFunctions方法

const render = compileToFunctions(template)
// 把生成的render函数赋值到options的render属性上
options.render = render
// compiler/index.js

const { parse } = require('./parse.js')
const { generate } = require('./codegen.js')

function compileToFunctions (template) {

    // 把传进来的template传入parse函数中,并生成抽象语法树(AST)
    // 抽象语法数是一个描述dom结构的树结构,包括html,css,js代码
    // 使用变量ast接收AST
    let ast = parse(template)

    // 把上面生成的AST传入generate函数中
    // 生成一个render格式的函数代码
    // 格式大概是类似_c('div',{id:"app"},_c('div',undefined,_v("hello"+_s(name)),_c('span',undefined,_v("world"))))
    // _c代表创建元素,_v代表创建文本,_s代表文Json.stringify--把对象解析成文本
    let code = generate(ast)


    // 使用with改变this指向,可以方便code里去获取this(也就是Vue实例)里的数据
    let renderFn = new Function(`with(this){return ${code}}`)

    // 返回这个生成的render函数
    return renderFn
}

module.exports = {
    compileToFunctions: compileToFunctions
}

let ast = parse(template) 模板转换成ast语法树,
let code = generate(ast) ast转换成render函数所需的语法 返回

3、挂载$mount
mountComponent执行render函数 生成vnode,
vnode就是个对象,包含{ tag,data,children,key,text }之类的属性,
patch(oldVnode, vnode)方法执行,将vnode转换成真实dom,挂载完成。

初次挂载总结

new Vue对options进行初始化,对data进行递归遍历监听get、set,编译template时,触发属性的get方法,get中对有dep对watcher进行收集,在set时候通过dep.notify(),循环watcher进行页面更新,也就触发了对应的响应式,编译完成template生成vnode,通过patch方法将vnode转换成真实dom挂载到页面上,挂载完成。

vue computed原理

首先Watcher有三种类型
渲染Watcher: data里的变量监听,负责通知html重新渲染
computed Watcher:负责通知conputed里的依赖此变量的属性进行修改
user Watcher: watch对象里面定义的key,通知对应的变量函数执行

defineReactive函数中,每个对象都会实例化自己的dep = new Dep(),get时会把watcher收集进dep里,watcher也会收集dep,互相收集是因为computed没有自己的dept,要用他依赖的dept去做更新

image.png

lazy:true的配置是conputed的缓存,第一次使用会进行计算值,并且用value去缓存值,dirty改为false,依赖不更新,dirty一直是false,就会一直去取value的值,就是缓存的原理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容

  • 传送门vue技术揭秘:https://ustbhuangyi.github.io/vue-analysis/v2/...
    拾钱运阅读 659评论 0 2
  • vue面试题 一、vue优点 1.轻量级框架:只关注视图层,是一个构建数据的视图集合,大小只有几十kb; 2.简单...
    没糖_cristalle阅读 1,619评论 0 3
  • Vue.js面试题整理 一、什么是****MVVM****? MVVM是Model-View-ViewModel的...
    EmilWong阅读 245评论 0 0
  • 注: 路人读者请移步 => Huang Yi 老师的Vue源码阅读点这里, 我写这一篇笔记更倾向于以自问自答的形式...
    Xinxing_Li阅读 1,410评论 0 0
  • Vue.js实现原理 初始化创建Vue实例对象init过程会初始化生命周期,初始化事件中心,初始化渲染、执行bef...
    阿_洛阅读 259评论 0 0