Vue(双向数据绑定 虚拟DOM Promise Webpack 事件委托)原理
一.双向数据绑定
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