VUE双向绑定原理_vue的数据绑定怎么实现

VUE双向绑定原理_vue的数据绑定怎么实现烂大街原理:数据劫持+发布订阅者模式(obect.defineProperty())……..(此处省略8888个字节)。话不多说上代码HTML:<divid=”app”> <div> <divv-text=”myText”></div> <divv-text=”myBox”></d…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

烂大街原理:数据劫持+发布订阅者模式 (obect.defineProperty())……..(此处省略8888个字节)。

话不多说上代码

HTML:

<div id="app">
	<div>
	    <div v-text="myText"></div>
	    <div v-text="myBox"></div>
		<input type="text" v-model="myText">
	</div>
</div>

JS:仿vue数据初始化

const app = new Vue({
	el:'#app',
	data:{
		myText:'数据响应式',
		myBox:'我是一个盒子'
	}
})

核心:发布订阅者模式

//		发布订阅者设计模式
//		发布者化整为零,
		class Vue{
			constructor(options){
				this.options = options;
				this.$data = options.data;
				this.$el = document.querySelector(options.el);
				this._directive = {}; 
				
				this.Observer(this.$data);
				this.Complie(this.$el);
			}
			//劫持数据
			Observer(data){
				for( let key in data ){
					this._directive[key] = [];
					console.log(this._directive)
					let Val = data[key];
					let watch = this._directive[key];
					Object.defineProperty(this.$data, key, {
						get : function(){
							return Val;
						},
						set : function(newVal){
							if( newVal !== Val ){//新值不等于老值
								Val = newVal;
								//更新视图
								console.log(watch,'watch')
								watch.forEach(element => {
									element.update();
								})
							}
						}
					})
				}
			}
			//解析指令
			Complie(el){
				let nodes = el.children;
				for(let i = 0;i < nodes.length; i++){
					let node = nodes[i];
					if( nodes[i].children){
						this.Complie(nodes[i]);
					}
					if(node.hasAttribute("v-text")){
//						console.log(1)
						let attrVal = node.getAttribute('v-text');
						this._directive[attrVal].push(new Watcher(node,this,attrVal,'innerHTML'));
//						console.log(this._directive);
					}
					if(node.hasAttribute("v-model")){
						let attrVal = node.getAttribute('v-model');
						this._directive[attrVal].push(new Watcher(node,this,attrVal,'value'));
//						console.log(this._directive);
						node.addEventListener('input',(function(){
							return function(){
								console.log(1);
								this.$data[attrVal] = node.value;
							}
						})().bind(this));
						
					}
				}
			}
		}
//		订阅者
		class Watcher{
//			div.innerHTML = vue对象.$data['myText'];
			constructor(el, vm, exp, attr){
				this.el = el;
				this.vm = vm;
				this.exp = exp;
				this.attr = attr;
				this.update();
			}
			update(){
				this.el[this.attr] = this.vm.$data[this.exp];
			}
		}

浏览器展示效果:

VUE双向绑定原理_vue的数据绑定怎么实现

VUE双向绑定原理_vue的数据绑定怎么实现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194001.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • lrzsz命令包的下载及安装

    lrzsz命令包的下载及安装安装lrzsz命令包后可以使用上传(rz)命令和下载(sz)命令安装推荐yum可以一步到位从下载到安装(https://img-blog.csdnimg.cn/20190411194245896.png)

    2022年6月23日
    64
  • 生成对抗网络——GAN(一)「建议收藏」

    生成对抗网络——GAN(一)「建议收藏」Generativeadversarialnetwork据有关媒体统计:CVPR2018的论文里,有三分之一的论文与GAN有关!由此可见,GAN在视觉领域的未来多年内,将是一片沃土(CVer们是时候入门GAN了)。而发现这片矿源的就是GAN之父,Goodfellow大神。~~~生成对抗网络GAN,是当今的一大热门研究方向。在2014年,被Goodfellow大神提出来,当时的G…

    2025年7月9日
    3
  • 修改Docker中nginx容器默认的端口号配置[通俗易懂]

    修改Docker中nginx容器默认的端口号配置[通俗易懂]修改nginx的默认端口号一般来说,nginx默认使用的是80端口号,但是狗血的是服务器上80端口号被占用了

    2025年8月30日
    5
  • 浅谈Console.WriteLine();「建议收藏」

    今日看《老粱故事汇》,介绍日本已逝巨星高仓健,才初步对此人有所了解。老高一生演绎了许多经典的影幕形象,男主角都收获了真挚的爱情……可现实生活中,真实的老高,却一辈子只经历过一次婚姻,在离婚后终究不能从失败的婚姻中走出,最终孤老一生……所以,看事物,看人,不能光看表面,要有一双发现的眼睛,看到他的本质……   借此机会,讲一个C#中用于输出的最常见不过的语句的一个注意事项……谈到Cons

    2022年4月17日
    65
  • 一次简单的反射型XSS操作及思路

    一次简单的反射型XSS操作及思路xss是类似对html代码的注入,拼接恶意代码获取cookie等分为三种类型,分别是反射型、存储型和dom型反射型是不存入数据库,对自己有影响存储型是存入数据库,对来访者都有影响1.进入靶场看到输入框,进行插入js标签输入框里输入:<script>alert(1)</script>点击搜索语句没有执行,而是被当做文本搜索了,这显然不是我们想看到的,点…

    2022年6月10日
    32
  • IIS7 beta FREE WEBHOSTING FREE HOSTING FOR ASP.NET 2.0 IIS7[通俗易懂]

    IIS7 beta FREE WEBHOSTING FREE HOSTING FOR ASP.NET 2.0 IIS7[通俗易懂]FreeIIS7BetaHostingMaximumASPMaximumASPisproudtobethefirstHosterpartneredwithMicrosofttohelpcuttingedgedev…

    2022年10月8日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号