ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

自己动手来做一个MVVM框架

2021-04-28 15:03:33  阅读:146  来源: 互联网

标签:MVVM 框架 js 动手 指令 解析 节点 模板


1. MVVM模式

MVVM 模式是 MV* 模式的一个变种。

2f44bb992620ab32eb17d78a314a8810.png

相对MVP模式,它采用双向绑定(data-binding):View发生变动,自动反映在 ViewModel上,反之亦然。当下流行的Vue就是采用的这种模式。

2. MVVM具体实现

MVVM框架最常见的特性之一就是数据的双向绑定,效果如下:

a8dea7b07059aec1c89727c7a9d66690.png

代码如下:

3b2f1dcb7ae4fdcdb4f8d0f359adc16b.png

常见的数据绑定方式有如下3种:

l 发布者-订阅者模式(Backbone.js) -- 监听

l 脏值检查(Angualr.js)        -- 周期循环检查

l 数据劫持(Vue.js)            -- 数据劫持结合发布者-订阅者模式

23a2d86dea02f547ee79a8e9e89eeb3e.png

2.1. 实现MVVM结构

a85e42218df2a2c2eefa2ac0250d5b79.png

在原型上提供代理方法,采用Object.defineProperty来胁持值的获取和设值操作:

4f75b828a6a52d43fadbcaa629335dae.png

2.2. 实现属性劫持

创建一个observer.js完成模型数据的胁持。

首先定义一个observe方法,接受模型数据。

a1c53a01c3be7d190370e2995a2456a5.png

定义一个defineReactive方法来完成模型属性的胁持:

8988a7d1fb13545193a74f24a88fa797.png

2.3. 实现模板解析

首先接MVVM中调用模板解析器。

563ec683260093f2bf97b86ea4e7f2b1.png

接下来创建一个templateCompiler.js.

大概思路:

Ø 准备需要的目标模板盒子和vm对象。

Ø 把模板提取到内存fragment中,方便做批量编译

Ø 执行初始化编译方法,逐行对fragment中的节点进行编译。

目前主要针对文本节点。例如:{{message}}

元素节点上的指令。例如:v-model

Ø 最后把结果内容放回到页面。

2e6c1cfacb57f6b978fd8a478df4fb24.png

在原型中实现方法:

7c876d5c94ab33600280da9b306fddc4.png


使用documentFragment来创建内存代码片段,提高解析效率

e38e0ea68fe955d5c24ab2be74df10a3.png

初始化方法,逐行提取出模板盒子中每一个节点,根据类型做不同解析

f7a9a9a1de63ccf86b0a50a3cb26ef29.png

提供2种解析方法,分别把“表达式”内容当成文本指令解析,和元素节点的“指令属性”解析。

d3384a846a6b7346834b18878a229efe.png


提供指令解析对象。

f264856d4f723e8f940ea327d75c0e0f.png


根据不同指令,提供对应的更新规则。

29954d0dc73f3beabf97b9abef1dd249.png

OK,做到这一步,我们初步实现了对模板的解析,实现了初次模型渲染到视图。

b6f36b81ab7c510a51bac35b2cdad042.png

但是目前还无法在对一次渲染之后的操作进行相应。所以,我们还需要一个“观察者”,对将来发生的变化进行响应!!

2.4.
实现变化监听

创建观察者构造,收集观察所需信息。

fe7897f2dc23ebe0c594a188cefb5c32.png

在原型上扩展观察者的获取和更新方法

8874504db73102946e68fc73e0133fee.png

联通订阅体系,首先回到observer.js中,定义发布对象。

3f92a7443a0f1095e1c5c092684fc1d6.png

在observe逻辑中

152213ea1c3e9f9f6b8f205c0c966cc2.png

一切准备就绪,去为我们的表达式或者指令关注的属性,添加观察者。

e0a9e8606225b08b0fcf4fc04f605f89.png

图片22.png (77.62 KB, 下载次数: 82)

下载附件

2018-4-11 17:39 上传

一切就绪,双向绑定实现。


标签:MVVM,框架,js,动手,指令,解析,节点,模板
来源: https://blog.51cto.com/u_15128443/2739566

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有