# 双向数据绑定的原理
# 一个简易的双向绑定
通过 addEventListener 监听 event 改变数据。
通过 defineProperty 监听 data 改变 dom.value。(vue3 中使用了 proxy 但原理一致)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<input type="text" v-mode="msg" />
<p v-mode="msg"></p>
<script>
const data = {
msg: "你好",
};
const input = document.querySelector("input");
const p = document.querySelector("p");
input.value = data.msg;
p.innerHTML = data.msg;
//视图变数据跟着变
input.addEventListener("input", function () {
data.msg = input.value;
});
//数据变视图变
let temp = data.msg;
Object.defineProperty(data, "msg", {
get() {
return temp;
},
set(value) {
temp = value;
//视图修改
input.value = temp;
p.innerHTML = temp;
},
});
data.msg = "小李";
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39