v-mode的实现原理

v-mode的实现原理

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>v-mode的简单实现</title>
	</head>

	<body>
		<div id="app">
			<input id="input" type="text" v-mode="inputVal" />
			<br />
			<span id="span"> </span>
		</div>
	</body>
	<script>
		/***
		 *实现的思路:
		 * m - v   通过查找节点,匹配节点名称,将data中最新的值利用daom设置到网页上显示----->查找指令赋值
		 * v - m  通过监听输入框的事件 拿到最新的值赋值到data中即可--->事件监听
		 *
		 * */

		let data = {
			inputVal: 'v-mode的简单实现',
			age: 15,
		}
		const proxyReative = (data) => {
			observe(data)
			return new Proxy(data, {
				get(target, key) {
					return target[key]
				},
				set(target, key, newVal) {
					if (target[key] === newVal) return
					target[key] = newVal
					compile()
				},
			})
		}

		const observe = (data) => {
			Object.keys(data).forEach((key) => {
				if (typeof data[key] === 'object') {
					data[key] = proxyReative(data[key])
				}
			})
		}
		const vm = proxyReative(data)
		// 获取元素
		const appRef = document.getElementById('app')
		const inputRef = document.getElementById('input')
		const span = document.getElementById('span')
		span.innerText = data.inputVal
		const compile = () => {
			//拿到节点
			const childrenNodes = appRef.childNodes
			// 遍历节点
			childrenNodes.forEach((node) => {
				if (node.nodeType === 1) {
					const arrts = node.attributes
					Array.from(arrts).forEach((arrt) => {
						// console.log(arrt); v-mode="inputVal" nodeName:v-mode  nodeValue:inputVal
						if (arrt.nodeName === 'v-mode') {
							// 更新数据
							console.log('更新了', arrt.nodeValue)
							inputRef.value = data[arrt.nodeValue]
							span.innerText = data[arrt.nodeValue]
						}
					})
				}
			})
		}
		compile()
		// 监听输入框的变化
		inputRef.addEventListener('input', function (e) {
			data.inputVal = e.target.value
			span.innerText = data.inputVal
		})

		 
	</script>
</html>

效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ベ远行ミ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值