手写简易MVVM框架

手写简易MVVM框架

参考视频:https://www.bilibili.com/video/BV1Ap411d7Ai?t=4815

  • demo文件夹下为视频版源码(根目录下为手写练习,主要在compile里小部分改进,可忽略)
  • 实现结果:v-model双向数据绑定及{{}}
  • 代码地址:https://github.com/hxy941025/-MVVM-

大体思路

  • 主要分为模板编译、数据劫持、观察者(包含发布订阅)三个部分
  • 模板编译:获取vm实例里html模板,针对其中的字符串模板{{}}及v-指令进行“翻译”,写出其底层相应操作
  • 数据劫持:遍历vm实例里data对象,为每个数据绑定setter和getter,触发get时将当前元素watcher推入订阅者数组,触发set时,如果值更新则通知订阅者更新数据
  • 观察者:给数据对应的元素绑定一个观察者实例,并推入订阅者数组,当数据更新时发布订阅通知元素数据变化
    在这里插入图片描述

具体模块

MVVM

  • constructor 接收一个对象,将模板el和数据data绑定到this上,如果存在模板el,则开始进行编译,编译前开启数据劫持
  • proxyData 将$data内数据直接代理到vm实例上

Compile 模板编译

  • 编译元素 v指令等、编译文本 {{}}
  • 接收两个参数,模板el及mvvm实例vm,将数据分别绑定到this上,需判断el是否为元素节点
  • 如果能获取到元素,才开始编译
    • 将真实DOM放入内存中,辅助方法:node2fragement,
    • 编译,提取v-等及{{}}节点
    • 将编译好的fragement放进页面DOM中
  • compile 递归,遍历el所有子节点,若为元素节点则进行元素节点编译,若为文本节点则进行文本节点编译
  • compileElement 编译元素节点,判断是否存在v-指令,进行相应操作
  • compileText 编译文本节点,判断是否存在{{}},进行相应操作
  • 编译工具CompileUtil
    • 获取元素节点中的值,考虑多层嵌套对象的情况
    • 获取文本节点中的值,按其表达式取值
    • text 匹配到文本节点时的具体操作
    • model 匹配到v-指令时的具体操作
    • 更新函数:匹配到文本或元素节点后更新值的操作

Observer 数据劫持

  • getter、setter、发布订阅
  • 接收data,并观察
  • observe,劫持观察data,若data不为对象或空,则不做任何操作,递归遍历data key值,一一劫持
  • defineReactive 劫持函数,当触发get时将当前watcher推入订阅者数组,触发set时,如果值更新则通知订阅者更新数据

watcher 观察者

  • 数据变化完需要影响模板,给需要变化的元素增加一个观察者,当数据变化后执行对应方法更新视图
  • constructor 接收vm实例 expr 回调函数
  • get 先获取一下老值保存在实例上
  • update 对外暴露的方法,当数据更新时调用,获取新值与老值对比,如果发生变化则执行回调函数,将新值传进去

Dep 发布订阅

  • 维护一个关联数据的订阅数组,当数据发生变化时,对订阅的数组遍历发布,使其重新获取数据
  • addSub 收集订阅,推入订阅者数组
  • notify 发布订阅
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程介绍本套课程,大喵将带着大家手把手,编辑每一行代码,使用原生Javascipt及ES6的一些新特性,仿照目前国内非常流行的Vue框架的源码,开发构建一个属于你们自己的MVVM框架。让大家能够很清晰的学习及掌握,模板编译,数据绑定,响应式,文档碎片,观察者模式,发布订阅模式等等,这些Vue的核心知识点,都是怎么回事,它们之间有哪些关联,是如何进行双向数据绑定的等等。在使用vue2.x的核心Object.defineProperty构建完成框架后,大喵也会使用Vue3.0引入的数据劫持的Proxy新特性,来改造我们的MVVM框架,提升我们的框架性能。最终,大喵会手把手带着大家,从0开始配置webpack.config.js配置文件以及引入babel-loader,配置.babelrc文件,转换我们JS文件中的的ES6语法,最终压缩输出我们的MVVM框架库文件。课程目录01 手把手搭建MVVM框架 课程介绍、02 文件结构及基础类创建、03 入口类DamiaoMvvm的实现、04 模板编译、05 元素节点解析编译、06 v-model 数据绑定逻辑梳理、07 v-model 数据绑定实现、08 模板文本编译逻辑梳理、09 模板文本渲染绑定、10 观察者Wather逻辑梳理、11 Wather 逻辑实现、12 Object.defineProperty()、13 defineProperty 小案例、14 observer数据劫持梳理、15 defineProperty数据劫持实现、16 发布订阅类实现、17 Proxy 介绍与概述、18 使用Proxy改造MVVM框架、19 使用Proxy实现响应式、20 webpack 打包配置、21 babel 配置及文件输出、22 Mvvm Proxy 框架打包、23 Mvvm 框架搭建课程总结MVVM框架介绍MVVM是 Model-View-ViewModel 的缩写。mvvm是一种设计思想。Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来,ViewModel 是一个同步View 和 Model的对象。在MVVM架构模式下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值