仿照vue实现简易的MVVM框架(一)

代码github地址: https://github.com/susantong/myMVVM

主要的方法有:

  1. compile
    深度遍历前端界面的节点,将其复制进一个addQuene队列中

  2. pasers
    遍历所有的节点,并将节点包装成一个含有本节点、自定义属性及属性值的对象。要想实现双向绑定,重要的一步是,为自定义s-model的节点绑定事件(input框的双向绑定,监听oninput事件)

  3. observe
    可是说是最为关键的一步,它是MVVM框架实现双向绑定的基础。我们知道,是通过es5中的Object.defineproperty()去实现,劫持set和get属性,以此来通知所有订阅者做出改变。这一步也踩了一些坑,不过是一些比较小而基础的错误,以此看出基础的重要性,打好基础是关键啊!这里展示出关键代码:

	this.watch = function(obj, callback) {
		this.$observeObj = function() {
			var that = this;
			this.callback = callback;
			//console.log(Object.keys(obj));
			Object.keys(obj).forEach(function(prop) {
				var val = obj[prop];
				Object.defineProperty(obj, prop, {
					get: function() {
						return val;
					},
					set: function(newVal) {
						var temp = val;
						//console.log(newVal);
						val = newVal;
						//通知所有订阅者改变
						that.cache.forEach(function(item) {
							if (item[prop]) {
								item[prop] = newVal;
							}
						});
						that.callback();
					},
					enumerable: true,
    				configurable: true
				});
			});
		}

		this.$observeObj();
	};

	this.observe = function() {
		this.watch(data, this.render);
	};
  1. render
    刚开始渲染或数据发生改变时需要重新渲染。这个函数的主要点在于,对于指令的实现,比如s-text,就是简单的数据展现,s-show需要操作css的display属性等,这些都可以通过查看官网去看细节,然后去操作数据,以达到相同的效果。

初期的效果已经实现,更多的指令需要去拓展,看懂了就不会觉得vue如此神秘了~

posted @   susantong  阅读(797)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示