自己实现简单版Vue--2. 实现数据绑定视图
利用Object.defineProperty()
方法实现数据的监听
Object.defineProperty()方法可以具体参考链接:http://sunyunzeng.com/JavaScript%E4%B8%AD%E7%9A%84%E5%AF%B9%E8%B1%A1/#%E8%AE%BF%E9%97%AE%E5%99%A8%E5%B1%9E%E6%80%A7
该方法可以定义对象数据在访问操作时的一些约定。
- 定义 Observer 对象
1 | class Observer{ |
- 利用Observer对象对数据进行劫持
1 | class MVue { |
- 定义Dep容器及Watcher对象对数据变化进行监听
1 | class Watcher{ |
- 在Observer中绑定Dev
1 | class Observer{ |
在编译工具中绑定Watcher
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
33const compileUtil = {
// ... 省略
getContent(expr, vm){
// {{person.name}}--{{person.age}}
// 防止修改person.name使得所有值全部被替换
return expr.replace(/\{\{(.+?)\}\}/g, (...args)=>{
return this.getValue(args[1], vm);
});
},
text(node, expr, vm) {
let value;
if(expr.indexOf('{{')!==-1){
value = expr.replace(/\{\{(.+?)\}\}/g, (...args)=>{
// text的 Watcher应在此绑定,因为是对插值{{}}进行双向绑定
// Watcher的构造函数的 getOldVal()方法需要接受数据或者对象,而{{person.name}}不能接收
new Watcher(args[1], vm, ()=>{
this.updater.textUpdater(node, this.getContent(expr, vm));
});
return this.getValue(args[1], vm);
});
}else{
value = this.getValue(expr, vm);
}
this.updater.textUpdater(node, value);
},
html(node, expr, vm) {
let value = this.getValue(expr, vm);
// html对应的 Watcher
new Watcher(expr, vm, (newVal)=>{
this.updater.htmlUpdater(node, newVal);
})
this.updater.htmlUpdater(node, value);
}在MVue类的构造函数中绑定Observer
1 | class MVue { |
项目地址
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 孙云增的博客!
评论