您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java中怎么實現(xiàn)實現(xiàn)一個簡單得數(shù)據(jù)響應(yīng)系統(tǒng)”,在日常操作中,相信很多人在Java中怎么實現(xiàn)實現(xiàn)一個簡單得數(shù)據(jù)響應(yīng)系統(tǒng)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中怎么實現(xiàn)實現(xiàn)一個簡單得數(shù)據(jù)響應(yīng)系統(tǒng)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
其實,這就是一個依賴收集的容器, 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; }
遞歸,將 data 對象所有屬性轉(zhuǎn)化為訪問器屬性
// 轉(zhuǎn)為訪問器屬性 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 對象所有屬性轉(zhuǎn)化為訪問器屬性 function observe (data) { if(Object.prototype.toString.call(data) !== '[object Object]') return; new Observer(data); }
此時就可以把任意一個對象的全部屬性轉(zhuǎn)為訪問器
const data = { a: 1, b: 2 } // 首先監(jiān)控一個對象 observe(data);
watcher
的主要功能是檢測某個屬性,當(dāng)屬性變化時觸發(fā)一個回調(diào)
class Watcher{ /** * @params {Function} exp 一個屬性表達(dá)式 * @params {Function} fn 回調(diào) */ constructor(exp, fn) { this.exp = exp; this.fn = fn; // 存 watcher // Dep.target = this; pushTarget(this); // 先執(zhí)行一次表達(dá)式函數(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') })
data.a = 3; // change data.b = 3; // change
到此,關(guān)于“Java中怎么實現(xiàn)實現(xiàn)一個簡單得數(shù)據(jù)響應(yīng)系統(tǒng)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。