Vue的响应式原理及实现

Vued的两大特征:数据驱动 & 组件化开发


Vue2.0响应式原理:发布订阅模式 + 双向数据绑定

	<div id="app">
		<div>View-1:<span class="view1">11111</span></div>
		<div>View-2:<span class="view2">22222</span></div>
	</div>
	// 订阅器模型
	let Dep = {
		clientList: {},
		// 添加订阅者
		listen: function(key,fn) {
			(this.clientList[key] || (this.clientList[key]=[])).push(fn);
		},
		// 推送方式
		trigger: function() {
			let key = Array.prototype.shift.call(arguments);
			let fns = this.clientList[key];
			if(!fns || fns.length===0) {
				return false;
			}
			for(let i=0,fn; fn=fns[i++];) {
				fn.apply(this,arguments);
			}
		}
	}
	// 数据劫持
	let dataHi = function({data,tag,datakey,selector}) {
		let ele = document.querySelectorAll(selector)[0];
		Object.defineProperty(data,datakey,{
			get: function() {
				console.log('get',val);
				// 获取数据 - 当前值
				return val;
			},
			set: function(newVal) {
				console.log('set',newVal);
				// 获取数据 - 被改值
				val = newVal;
				// 数据变化
				Dep.trigger(tag,val)
			}
		});
		// 添加订阅者
		Dep.listen(tag,function(text) {
			// console.log(ele);
			ele.innerHTML = text;
		});
	}
	let textObj = {};
	dataHi({
			data: textObj,
			tag: "view-1",
			datakey: "one",
			selector: ".view1",
		});
		dataHi({
			data: textObj,
			tag: "view-2",
			datakey: "two",
			selector: ".view2",
		});
		textObj.one = "one-one-one";
		textObj.two = "two-two-two";

在这里插入图片描述


Vue2.0响应式原理:proxy() 代理

	let obj = {
		name: "jason",
		age: 22,
	}
	const pro = new Proxy(obj,{
		get(target,pName) {
			console.log("读取: ",pName);
			return target[pName];
		},
		set(target,pName,val) {
			console.log("修改: ",pName,val);
			target[pName] = val;
		},
		deleteProperty(target,pName) {
			console.log("删除: ",pName);
			return delete target[pName];
		}
	});
	pro.name
	pro.name = "Code"

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值