实现Vue-MVVM-step1

本文通过一个简单的示例展示了 Vue.js 中 MVVM 模式的实现原理。利用 JavaScript 的 Object.defineProperty 方法来实现数据的响应式更新,并通过自定义 Vue 类模拟了数据变化时视图的更新过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>Vue-MVVM</title>
	</head>
	<body>
		<input type="text" id="input1" value="" oninput="myFun()" />
		<input type="text" id="input2" />
	</body>
	<script>
		function myFun() {
			o._data.test = document.getElementById('input1').value
		}
		/* 这个函数用来模拟视图更新 */
		function cb(val) {
			console.log('试图更新啦~~');
			document.getElementById('input2').value = val
		}
		/* 遍历所有属性的方式对该对象的每一个属性都通过 defineReactive  */
		function observer(value) {
			if (!value || (typeof value !== 'object')) {
				return;
			}
			Object.keys(value).forEach((key) => {
				defineReactive(value, key, value[key]);
			})
		}
		/* 实现对对象的「响应式」 */
		function defineReactive(obj, key, val) {
			Object.defineProperty(obj, key, {
				enumerable: true,		// 能否被遍历,比如 for in,默认值为 false
				configurable: true,		// 描述该属性的描述符能否被改变,默认值为 false
				get: function reactiveGetter() {		// 取值的时候调用,默认值为 false
					return val;
				},
				set: function reactiveSetter(newVal) {		// 设置值的时候使用
					if (newVal === val) return;
					cb(newVal);
				}
			});
		}
		/* 声明类 */
		class Vue {
			constructor(options) {
				this._data = options.data;
				observer(this._data)
			}
		}
		/* 创建实例 */
		var o = new Vue({
			data: {
				test: ""
			}
		})
	</script>
</html>

复制代码


转载于:https://juejin.im/post/5b6178ebe51d451954240356

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值