前端开发双绑数据

双绑数据
html:
在这里插入图片描述

JS:

class vue extends EventTarget{
	constructor(option){
		super();
		this.option = option;
		this._data = this.option.data;
		this.el = document.querySelector(this.option.el);
		this.observe(this._data);
		this.compileNode(this.el);
	}

	observe(data){
		let _this = this; // 给_this赋值===this,否则this的指向不是dispatchEvent 而是Proxy
		this._data = new Proxy(data,{
			set(target,prop,newValue){
				console.log(newValue);
				let event = new CustomEvent(prop,{
					detail:newValue
				});
				_this.dispatchEvent(event);
				return Reflect.set(...arguments);
			}
		});
	}

	compileNode(el){
		let child = el.childNodes;
		[...child].forEach(node=>{
			if(node.nodeType === 3){
				//console.log('这是一个文本节点');
				let text = node.textContent;
				let reg = /\{\{\s*([^\s\{\}]+)\s*\}\}/g;
				if (reg.test(text)) {
					let $1 = RegExp.$1;
					this._data[$1]&&(node.textContent = text.replace(reg,this._data[$1]));
					this. addEventListener($1,e=>{
						node.textContent = text.replace(reg,e.detail)
					});
				}
			}else if(node.nodeType === 1){
				let attr = node.attributes;
				if (attr.hasOwnProperty('v-model')){
					let keyName = attr['v-model'].nodeValue;
					node.value = this._data[keyName];
					node.addEventListener('input',e=>{
						this._data[keyName] = node.value;
					})
				}
				this.compileNode(node);
			}	
		})
	}
}

本人JavaScript萌新有大佬看到欢迎指导~~蟹蟹


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值