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>
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) => {
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>
效果