實現(xiàn)一個簡單得數(shù)據(jù)響應系統(tǒng)
更新時間:2021年11月08日 10:49:08 作者:zz
這篇文章主要介紹了實現(xiàn)一個簡單得數(shù)據(jù)響應系統(tǒng),文章介紹的數(shù)據(jù)響應系統(tǒng)會用到Dep,其實,這就是一個依賴收集的容器, depend 收集依賴, notify 觸發(fā)依賴,下面來看看詳細的內(nèi)容結介紹,需要的朋友可以參考一下
1、Dep
其實,這就是一個依賴收集的容器, depend 收集依賴, notify 觸發(fā)依賴
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;
}
2、了解 obverser
遞歸,將 data 對象所有屬性轉化為訪問器屬性
// 轉為訪問器屬性
function defineReactive (obj, key, val, shallow) {
// 創(chuàng)建一個依賴收集容器
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;
// 繼續(xù)遞歸遍歷
observe(newVal);
// 觸發(fā)依賴
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);
}
此時就可以把任意一個對象的全部屬性轉為訪問器
3、了解 watch 和 observer
const data = {
a: 1,
b: 2
}
// 首先監(jiān)控一個對象
observe(data);
watcher 的主要功能是檢測某個屬性,當屬性變化時觸發(fā)一個回調(diào)
class Watcher{
/**
* @params {Function} exp 一個屬性表達式
* @params {Function} fn 回調(diào)
*/
constructor(exp, fn) {
this.exp = exp;
this.fn = fn;
// 存 watcher
// Dep.target = this;
pushTarget(this);
// 先執(zhí)行一次表達式函數(shù),會在調(diào)用過程中,
// 觸發(fā)到 data.a 的訪問器, data.a 的 get 被執(zhí)行,
// 觸發(fā) dep.depend() 開始收集依賴
this.exp();
// 釋放 Dep.target
popTarget();
}
}
// new Watcher 這樣一個依賴就被收集了
new Watcher(() => {
return data.a + data.b;
}, () => {
console.log('change')
})
4、觸發(fā)依賴
data.a = 3; // change data.b = 3; // change
5、總結一下流程
- 把一個對象的全部屬性轉化為訪問器
- 當為某一個屬性增加
watcher時,會觸發(fā)改屬性的get,get函數(shù)中會把該watcher存到該屬性的dep依賴容器中 - 當這個屬性發(fā)生變化時,會出發(fā)改屬性的
set的方法,set函數(shù)中會把dep存的依賴都執(zhí)行
到此這篇關于實現(xiàn)一個簡單得數(shù)據(jù)響應系統(tǒng)的文章就介紹到這了,更多相關數(shù)據(jù)響應系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
相關文章
這篇文章主要介紹了Javascript基礎知識中關于內(nèi)置對象的相關知識的相關資料,需要的朋友可以參考下面小編薇大家?guī)淼木饰恼?/div> 2021-09-09
js c++ vue方法與數(shù)據(jù)交互通信示例
這篇文章主要為大家介紹了js c++ vue方法與數(shù)據(jù)交互通信示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08最新評論

