目录1、Dep2、了解 obverser3、了解 watch 和 observer4、触发依赖5、总结一下流程1、Dep 其实,这就是一个依赖收集的容器, depend 收集依赖,
其实,这就是一个依赖收集的容器, depend
收集依赖, notify
触发依赖
class Dep{
constructor() {
this._subs = [];
}
depend () {
this._subs.push(Dep.target)
}
notify() {
this._subs.forEach(item => {
item.fn();
})
}
}
// 其实就是 dep 和 watcher 基情满满的开始,watcher 中用到
// 通过一个全局属性来存 watcher
Dep.target = null;
function pushTarget(watch) {
Dep.target = watch;
}
function popTarget() {
Dep.target = null;
}
递归,将 data 对象所有属性转化为访问器属性
// 转为访问器属性
function defineReactive (obj, key, val, shallow) {
// 创建一个依赖收集容器
let dep = new Dep();
let childOb = !shallow && observe(val)
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter () {
if(Dep.target) {
// 收集依赖
dep.depend();
}
return val;
// ...
},
set: function reactiveSetter (newVal) {
if(newVal === val) return;
// 继续递归遍历
observe(newVal);
// 触发依赖
dep.notify();
// ...
}
})
}
class Observer{
constructor(data) {
this.walk(data);
}
walk(data) {
const keys = Object.keys(data)
for (let i = 0; i < keys.length; i++) {
defineReactive(data, keys[i], data[keys[i]])
}
}
}
// 递归,将 data 对象所有属性转化为访问器属性
function observe (data) {
if(Object.prototype.toString.call(data) !== '[object Object]') return;
new Observer(data);
}
此时就可以把任意一个对象的全部属性转为访问器
const data = {
a: 1,
b: 2
}
// 首先监控一个对象
observe(data);
watcher
的主要功能是检测某个属性,当属性变化时触发一个回调
class Watcher{
constructor(exp, fn) {
this.exp = exp;
this.fn = fn;
// 存 watcher
// Dep.target = this;
pushTarget(this);
// 先执行一次表达式函数,会在调用过程中,
// 触发到 data.a 的访问器, data.a 的 get 被执行,
// 触发 dep.depend() 开始收集依赖
this.exp();
// 释放 Dep.target
popTarget();
}
}
// new Watcher 这样一个依赖就被收集了
new Watcher(() => {
return data.a + data.b;
}, () => {
console.log('change')
})
data.a = 3; // change
data.b = 3; // change
watcher
时,会触发改属性的 get
,get
函数中会把该 watcher
存到该属性的 dep
依赖容器中set
的方法,set
函数中会把 dep
存的依赖都执行到此这篇关于实现一个简单得数据响应系统的文章就介绍到这了,更多相关数据响应系统内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: 实现一个简单得数据响应系统
本文链接: https://lsjlt.com/news/156695.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0