如何追踪变化

当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter


一个简单的栗子:

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
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Vue define property</title>
</head>

<body>
Title:
<h4 id="title"></h4>
Input:
<input type="text" oninput="changeTitle(this.value)">
<script>
let obj = {}, temp = {},$element = document.getElementById('title');
Object.defineProperty(obj, 'title', {
get() {
return temp.title;
},
set(val) {
temp.title = val;
$element.innerText = val;
}
});
function changeTitle(val){
obj.title = val;
}
</script>
</body>

</html>


每个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。