链氪巴士
  1. 首页
  2. 站点导航
  3. 文章
  4. 快讯
  5. 软件
  6. 书刊
  7. 关于

DMQ/mvvm:剖析vue实现原理并自己动手实现mvvm

这个项目主要是剖析Vue的双向数据绑定原理并自己动手实现mvvm。相关代码主要摘取自vue源码并进行简化改造,虽然存在未考虑数组处理、数据循环依赖等问题,但不影响对原理的理解。项目详细介绍了数据监听器Observer、指令解析器Compile、Watcher和MVVM入口函数等...

访问官网 →

【Github】项目名:DMQ/mvvm:剖析vue实现原理并自己动手实现mvvm

项目简介

这个项目主要是剖析Vue的双向数据绑定原理并自己动手实现mvvm。相关代码主要摘取自vue源码并进行简化改造,虽然存在未考虑数组处理、数据循环依赖等问题,但不影响对原理的理解,并且所有相关代码都能在github上找到。

项目目的

  1. 帮助读者了解vue的双向数据绑定原理以及核心代码模块。
  2. 满足读者对于如何实现双向绑定的好奇心,并且在阅读vue源码时更有帮助。

核心技术

  1. 数据监听器Observer:利用Object.defineProperty()对数据对象的属性进行递归遍历监听,将数据对象的所有属性加上setter和getter,从而在数据变动时能拿到最新值并通知订阅者。通过维护一个消息订阅器数组收集订阅者,数据变动触发notify,再调用订阅者的update方法。
  2. 指令解析器Compile:主要解析模板指令,将模板中的变量替换成数据,初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知就更新视图。为提高性能,会先将vue实例根节点的el转换成文档碎片fragment进行解析编译操作,解析完成再将fragment添加回原来的真实dom节点。
  3. Watcher:作为连接Observer和Compile的桥梁,在自身实例化时往属性订阅器(dep)里面添加自己,自身有update()方法,待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调。
  4. MVVM入口函数:整合Observer、Compile和Watcher三者,通过Observer监听model数据变化,Compile解析编译模板指令,Watcher搭起两者间通信桥梁,实现数据与视图的双向绑定效果,还利用Object.defineProperty()实现属性代理,使访问vm的属性代理为访问vm._data的属性。

项目总结

本文围绕双向绑定的不同实现做法、Observer、Compile、Watcher、MVVM这几个模块阐述了双向绑定的原理和实现,通过梳理思路展示关键代码讲解如何实现MVVM双向绑定。文中可能存在不足,欢迎大家指正,期待大家留言参与讨论。

项目地址

GitHub链接直达