网络上有不少教你如何模仿vue手写mvvm的视频,我历来没有本身动手写过。这周末想着必定要把这件事情完成。html
下面就关于vue如何实现two-way data-binding作一个简单的步骤梳理,文字有点多,不过逐步看下去或许会对你们有所启发哦,同时我也会把须要用到的知识点罗列出来~ vue
所谓双向绑定,即数据变化 -> 视图更新;视图交互变化(如input) -> 数据model变动的效果。node
演示地址react
何为mvvm?简言之,把数据和视图进行关联的一种模式。这四个字母能够这么理解: Model, View, ViewModel。git
模仿vue来写一个本身的mvvm,往简单来说,通常涉及下面三个步骤:github
模板编译 Compile数组
数据劫持 Observe网络
所谓数据劫持就是当数据(必定是对象,引用类型的值)发生改变的时候,添加咱们本身的逻辑。通常状况下,咱们给对象赋值都是直接let obj = value,完毕。在这个过程当中咱们没法添加本身的逻辑,好比你但愿当对象的值发生改变时(即监听对象的变化,当发生改变时调用方法),例如给一个console输出或作点别的,却没法作到。app
那么如何添加本身的逻辑呢?答案就是ES5的Object.defineProperty方法。在调用Object.defineProperty方法时,若是不指定,configurable,enumerable和writable特性的默认值都是false,因此务必要把configurable和enumerable的值设置成true。最关键的是,给对像的某个key写上get和set方法,这样一来你就能够在取值和赋值的过程当中添加本身的逻辑了。dom
监听(数据)变化 Watcher
这是难点,也是关键点。
在Observe观察到对象数据发生变化了,可是没法改变视图(view)。因此,watcher的做用,就是给各个绑定数据的地方,一一对应的进行监听。在Observe发现数据变化后,调用watcher函数对相应的视图进行数据更新。
未完待续~
ps.我的认为单个功能的代码不超过30行比较好。若是超过了,能够拆分红多个细小的代码块,方便阅读,也方便梳理逻辑。