Vue(双向数据绑定 虚拟DOM Promise Webpack 事件委托)原理

vue

一.双向数据绑定

Vue 实现的双向数据绑定,是采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。要实现mvvm的双向绑定,就必须要实现以下几点:
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象

1. 实现一个数据监听器 Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者
 2. 实现一个指令解析器 Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数
 3. 实现一个 Watcher,作为连接 Observer 和 Compile 的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图
 4. 将 MVVM 作为数据绑定的入口,整合 Observer,Compile 和 Watcher 三者

二.虚拟DOM

模板 ==> 渲染函数 ==> 虚拟DOM树 ==> 真实DOM

  • vuejs通过编译将模板(template)转成渲染函数(render),执行渲染函数可以得到一个虚拟节点树
  • 在对 Model 进行操作的时候,会触发对应 Dep 中的 Watcher 对象。Watcher 对象会调用对应的 update 来修改视图。
    虚拟 DOM 的实现原理主要包括以下 3 部分:
    1.用 JavaScript 对象模拟真实 DOM 树,对真实 DOM 进行抽象;
    2.diff 算法 — 比较两棵虚拟 DOM 树的差异;
    3.pach 算法 — 将两个虚拟 DOM 对象的差异应用到真正的 DOM 树。

三.Promise

在Promise的内部,有一个状态管理器的存在,有三种状态:pending、fulfilled、rejected。    
(1) promise 对象初始化状态为 pending。    
(2) 当调用resolve(成功),会由pending => fulfilled。    
(3) 当调用reject(失败),会由pending => rejected。  
需要记住的是注意promsie状态 只能由 pending => fulfilled/rejected, 一旦修改就不能再变。

四.Webpack

对各个模块之间的依赖关系进行静态分析,然后将这些模块按照一定的规则生成对应的静态资源。
entry: 入口文件, webpack执行构建的第一步将从Entry开始,可抽象成输入
output: 输出结果,再webpack经过一些列处理并得出最终想要的代码后输出结果
module: 模块,在webpcak中一切皆模块,一个模块对应一个文件。webpack会从配置的Entry开始递归找出所有依赖的模块。
loaders: 模块转换器,将不同类型的文件进行处理,例如less、sass文件转换成css,typeScript转换成js
plugin: 扩展插件,在webpack构建过程实现扩展逻辑,来改变构建结果和做我们想要做的事情
chunk: 代码块,一个Chunk由多个模块组合而成,用于代码合并于分割

五.事件委托

JS事件代理就是通过给父级元素(例如:ul)绑定事件,不给子级元素(例如:li)绑定事件,然后当点击子级元素时,通过事件冒泡机制在其绑定的父元素上触发事件处理函数,主要目的是为了提升性能,因为我不用给每个子级元素绑定事件,只给父级元素绑定一次就好了,在原生js里面是通过event对象的targe属性实现

var ul = document.querySelector(“ul”);
ul.onclick = function(e){ // e指event,事件对象
var target = e.target || e.srcElement; // target获取触发事件的目标(li)
if(target.nodeName.toLowerCase() == ‘li’){ // 目标(li)节点名转小写字母,不转的话是大写字母
alert(target.innerHTML)
}
}

jq方式实现相对而言简单 $(“ul”).on(“click”,“li”,function() { //事件逻辑 }) 其中第二个参数指的是触发事件的具体目标,特别是给动态添加的元素绑定事件,这个特别起作用

以上是 Vue(双向数据绑定 虚拟DOM Promise Webpack 事件委托)原理 的全部内容, 来源链接: utcz.com/z/376397.html

回到顶部