Vue几大特性

一、响应式:

2.png

3.png

https://study.163.com/course/courseLearn.htm?courseId=1209592802#/learn/video?lessonId=1279995028&courseId=1209592802

/*
*
* 根据上图实现整体一个架构(包括MVVM类或者Vue类- 发布者,Watcher类-订阅者), 这里用到了一个订阅发布者设计模式
*
* 然后实现MVVM中的由M->V,把模型里面的数据绑定到视图
*
* 最后实现V->M, 当文本框输入文本的时候,由文本事件触发更新模型中的数据,同时也更新相对应的视图
*
*/
实现数据驱动视图的第一步, 组件data的数据一旦变化,立刻触发视图的更新
1、核心API --- Object.defineProperty : [作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性]
2、Object.defineProperty(obj, prop, desc) 【 监听对象、数组; 复杂对象、深度监听】
2.1、obj 需要定义属性的当前对象
2.2、prop 当前需要定义的属性名
2.3、desc 属性描述符
3、缺点(vue3.0启用Proxy--兼容性不好,且无法polyfill):
3.1、深度监听, 需要递归到底,一次计算量比较大,性能不好
3.2、无法监听原生数组, 需要特殊处理 【需要重新定义数组原型】


1.png

3.3、不能监听对象新增或删除属性 --- Vue.set 和 Vue.delete

二、模版编译 -- complier 【返回Vnode】

template -----》render过程

模版 ----》 真实DOM渲染的过程,中间有一个环节是把模板编译成 render 函数,这个过程我们把它称作编译。
Vue.js 提供了 2 个版本:
1、 Runtime + Compiler : 含编译代码的,可以把编译过程放在运行时做
2、Runtime only : 需要借助 webpack 的 vue-loader 事先把模板编译成 render函数

4.png

首先从[$mount]开始,可以看到,mount其实就是拿到了模板template,然后将这个template通过compileToFunctions方法编译成render函数, 主要是调用了compileToFunctions里面的compile方法。

          const compiled = compile(template, options) 
5.png

parse: 主要功能是将 template字符串解析成 AST(抽象语法树)--- 解释器;
optimize: 主要功能标记静态节点,为后面 patch 过程中对比新旧 VNode 树形结构做优化 --- 优化器 ;
generate: 主要功能就是根据 AST 结构拼接生成 render 函数的字符串 --- 生成器,如下:

{render: "with(this){return _c('div',{attrs:{"id":"test"}},[[_v(_s(val))]),_v(" "),_m(0)])}"}

后面通过 new Function 得到真正的渲染函数

render ----> VNode

关键: 主要通过 createElement 创建VNode

image.png

三、虚拟DOM & diff算法 -- vdom库 - snabbdom

【VNode 节点的形式来模拟一棵 Virtual DOM】

**虚拟DOM **

它产生的前提是浏览器中的 DOM 是很“昂贵"的,当我们频繁的去做 DOM 更新,会产生一定的性能问题


image.png

理解: 用JS模拟DOM结构, 计算出最小的变更,操作DOM。


6.png

snabbdom源码代码:

snabbdom.png

总结:
1、用JS模拟DOM结构(vnode)
2、新旧vnode对比,得出最小的更新范围,最后更新DOM ----- diff算法
3、数据驱动视图模式下,有效控制DOM操作

diff算法

【diff 算法是vdom中最核心、最关键的部分, 是实现Vue 和 React的重要基石】
【diff算法能在日常使用Vue React中体现出来 (key)】

  • diff 即对比, 是一个比较广泛的概念,如 linux diff命令、git diff、文件对比器等等。
  • 两个js对象也可以做diff
  • 两棵树做diff, 如这里的VDOM diff
1.png

优化时间复杂度到 O(n)
1、之比较同一层级,不跨级比较
2、tag不相同, 则直接删掉重建, 不在深度比较
3、tag 和 key两者都相同,则认为是相同节点, 不再深度比较

2.png

关键函数: patch()、patchVnode()、addVnodes、removeVnodes、updataChildren()【两种情况下都有children 对比 key的重要性】

四、组件化

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

推荐阅读更多精彩内容