js手写一个双向绑定demo
时间: 2023-11-09 08:06:44 浏览: 127
js实现数据双向绑定
好的,以下是一个简单的双向绑定 demo 实现:
```html
<!DOCTYPE html>
<html>
<head>
<title>双向绑定 Demo</title>
</head>
<body>
<label for="message">Message:</label>
<input type="text" id="message" />
<p>您输入的消息是:<span id="output"></span></p>
<script>
// 定义一个数据对象
const data = { message: '' };
// 将数据对象转换为响应式对象
function defineReactive(obj, key, val) {
Object.defineProperty(obj, key, {
get() {
console.log(`getter: ${val}`);
return val;
},
set(newVal) {
console.log(`setter: ${newVal}`);
val = newVal;
updateOutput();
}
});
}
// 更新输出内容
function updateOutput() {
const output = document.getElementById('output');
output.textContent = data.message;
}
// 绑定输入框和数据对象
const input = document.getElementById('message');
defineReactive(data, 'message', input.value);
input.addEventListener('input', (event) => {
data.message = event.target.value;
});
</script>
</body>
</html>
```
在上面的示例中,我们定义了一个数据对象 `data`,并将其转换为响应式对象。在响应式对象中,我们使用 Object.defineProperty() 方法定义了数据对象中的 `message` 属性,并在 getter 和 setter 中实现了依赖收集和更新操作。
接着,我们将输入框和数据对象进行了绑定,当输入框中的值发生变化时,会自动更新数据对象的 `message` 属性,并触发相应的更新操作。
最后,我们在页面上显示了一个输出框,用于显示当前输入的消息。每当数据对象中的 `message` 属性发生变化时,输出框的内容也会相应地发生变化,实现了简单的双向绑定。
阅读全文