Vue.js的异步更新DOM策略
Vue.js数组的依赖收集
前言
前面说了 Object 数据的变化侦测方式,下面我们来看一下对 Array 型数据的变化 Vue 是如何进行侦测的。
为什么 Object 数据和 Array 型数据会有两种不同的变化侦测方式?
这是因为对于 Object 数据我们使用的是 JS 提供的对象原型上的方法 Object.defineProperty,而这个方法是对象原型上的,所以 Array 无法使用这个方法,所以我们需要对 Array 型数据设计一套另外的变化侦测机制。
万变不离其宗,虽然对 Array 型数据设计了新的变化侦测机制,但是其根本思路还是不变的。那就是:还是在获取数据时收集依赖,数据变化时通知依赖更新。
下面我们就通过源码来看看 Vue 对 Array 型数据到底是如何进行变化侦测的。
Vue.js对象的依赖收集
为什么要依赖收集
在上一章中,我们知道了数据什么时候发生了变化,那么当数据发生变化时,我们就需要去通知视图更新。那么问题又来了,视图那么大,我们到底该通知谁去变化?总不能一个数据变化了,把整个视图全部更新一遍吧,这样显然是不合理的。
视图里谁用到了这个数据就更新谁,我们换个优雅说法:我们把”谁用到了这个数据”称为”谁依赖了这个数据”,我们给每个数据都建一个依赖数组(因为一个数据可能被多处使用),谁依赖了这个数据(即谁用到了这个数据)我们就把谁放入这个依赖数组中,那么当这个数据发生变化的时候,我们就去它对应的依赖数组中,把每个依赖都通知一遍,告诉他们:”你们依赖的数据变啦,你们该更新啦!”。这个过程就是依赖收集。
Vue.js响应式原理
关于 Vue.js
Vue.js 是一款 MVVM 框架,上手快速简单易用,通过响应式在修改数据的时候更新视图。当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter/setter。Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因。Vue 通过设定对象属性的 setter/getter 方法来监听数据的变化,通过 getter 进行依赖收集,而每个 setter 方法就是一个观察者,在数据变更的时候通知订阅者更新视图。
10Typescript中的装饰器
08Typescript中的模块
前端导出 Excel(CSV)文件
在项目中,有时候需要把一些数据导出到一个 Excel 文件中,这里记录下导出方案。
07Typescript中的综合使用
前面已经学习了 typescript 的相关概念、这里实现一个类型、接口、类 、泛型 综合使用的例子:
–TypeScript 封装统一操作 Mysql Mongodb Mssql 的底层类库