Vue 数据双向绑定原理——Vue 学习笔记(二)

vue.js 采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter 和 getter,在数据变化时发布消息给订阅者,触发相应的监听回调。也就是说数据和视图同步,数据发生变化,视图跟着变化,反之亦然。

当一个 Vue 实例被创建时,它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。

由于 JavaScript 的限制,Vue 不能检测数组和对象的变化,因为性能问题(性能代价和获得的用户体验收益不成正比)。

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

此方法接受三个参数:要操作的对象、要定义或修改的对象属性名、属性描述符。

发布者-订阅者模式:订阅者依赖于发布者,当发布者更新时,订阅者将收到通知,并自动更新。(和观察者模式不同的是多了一个事件调度中心)


原生 JS 实现的双向绑定:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>原生双向数据绑定</title>
	</head>
	<body>
		<input type="text" id="inText"/>
		<p id="showP"></p>
		
		<script>
			let obj = {
				data: ''
			};
			let text = document.getElementById("inText");
			let show = document.getElementById("showP");
			Object.defineProperty(obj, 'data', {
				set: function(val) {
					show.textContent = val;
					text.value = val;
				}
 			});
			obj.data = "hello world!";
			text.onkeyup = (event) => {
				obj.data = event.target.value;
			};
		</script>
	</body>
</html>

实现效果:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值