vue2.x響應(yīng)式原理

vue3.0發(fā)布了,回顧一波2.x原理

vue 2.x 響應(yīng)式原理

image

主要做了這么幾件事:數(shù)據(jù)劫持棚辽、收集依賴苍息、派發(fā)更新

  1. 數(shù)據(jù)劫持:new Vue的時候遍歷data對象疾渴,用Object.defineProperty給所有屬性加上了getter和setter
  2. 依賴的收集:render的過程穿稳,會觸發(fā)數(shù)據(jù)的getter存皂,在getter的時候把當(dāng)前的watcher對象收集起來
  3. 派發(fā)更新:setter的時候,遍歷這個數(shù)據(jù)的依賴對象(watcher對象)逢艘,進(jìn)行更新

數(shù)據(jù)劫持

通過Object.defineProperty劫持對象屬性,讓數(shù)據(jù)變?yōu)槭强捎^察的


class Vue {
    constructor(options) {
        observer(options.data);
    }
    observer(value) {
        if (!value || (typeof value !== 'object')) {
            return;
        }
        // 遍歷data對象 逐個加上getter setter
        Object.keys(value).forEach(key => defineReactive(value, key, value[key]));
    }
    defineReactive(obj, key, val) {
        const dep = new Dep(); // Dep是依賴收集類
        Object.defineProperty(obj, key, {
            enumerable: true, // 屬性可枚舉
            configurable: true  //屬性可被修改或刪除
            get() {
                dep.addSub(Dep.target); // 依賴采集
                return val;
            },
            set(newVal) {
                if (newVal === val) return;
                dep.notify(newVal); // 派發(fā)更新
            }
        })
    }
}

可以看到主要就是這個defineReactive函數(shù)骤菠,他利用Object.defineProperty實(shí)現(xiàn)了數(shù)據(jù)劫持

依賴收集&派發(fā)更新

那么vue是怎么知道當(dāng)數(shù)據(jù)改變的時候都要去通知誰呢它改?它用了一個訂閱者Dep,它用來存放我們的觀察者對象商乎,當(dāng)數(shù)據(jù)發(fā)生改變央拖,就通知觀察者,觀察者通過調(diào)用自己的update方法完成更新鹉戚。

<!--訂閱者Dep類-->

class Dep {
    constructor () {
        this.newDeps = [] // 用來存放我們的依賴對象(也即觀察者)
    }
    addDep (watcher) {
        this.newDeps.push(watcher) // 向隊(duì)列里新加一下watcher對象
    }
    update () {
        this.newDeps.forEach((sub) => {
            sub.update(); // 遍歷watcher進(jìn)行更新
        })
    }
}

<!--觀察者Watcher類-->
class Watcher {
    constructor  () {
        Dep.target = this  // new Watcher的時候把觀察者存放到Dep.target里面
    }
    update () {
        console.log("視圖更新啦~"); // 更新視圖
        <!--queueWatcher(this) 異步更新策略 后面再寫一篇介紹 -->
    }
}

new一個Watcher對象鲜戒,此時它會指向Dep.target,在render過程觸發(fā)getter抹凳,把Dep.target添加到依賴隊(duì)列遏餐。這樣便完成了依賴的收集。數(shù)據(jù)改變赢底,通知依賴進(jìn)行update操作失都。

image

以上代碼是2.x版本響應(yīng)式原理的代碼模擬柏蘑,在vue中這幾個類都是單獨(dú)的文件,源碼地址粹庞。

另外vue對數(shù)組做了特殊處理咳焚,數(shù)組的響應(yīng)式原理我補(bǔ)充在了另一篇文章里vue響應(yīng)式原理-數(shù)組篇

last but not least, 老鐵請留步,點(diǎn)個贊再走~??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庞溜,一起剝皮案震驚了整個濱河市革半,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌流码,老刑警劉巖又官,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旅掂,居然都是意外死亡赏胚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門商虐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觉阅,“玉大人,你說我怎么就攤上這事秘车〉溆拢” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵叮趴,是天一觀的道長割笙。 經(jīng)常有香客問我,道長眯亦,這世上最難降的妖魔是什么伤溉? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮妻率,結(jié)果婚禮上乱顾,老公的妹妹穿的比我還像新娘。我一直安慰自己宫静,他們只是感情好走净,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孤里,像睡著了一般伏伯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捌袜,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天说搅,我揣著相機(jī)與錄音,去河邊找鬼琢蛤。 笑死蜓堕,一個胖子當(dāng)著我的面吹牛抛虏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播套才,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼迂猴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了背伴?” 一聲冷哼從身側(cè)響起沸毁,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傻寂,沒想到半個月后息尺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疾掰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年搂誉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片静檬。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡炭懊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拂檩,到底是詐尸還是另有隱情侮腹,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布稻励,位于F島的核電站父阻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏望抽。R本人自食惡果不足惜加矛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煤篙。 院中可真熱鬧荒椭,春花似錦、人聲如沸舰蟆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽身害。三九已至,卻和暖如春草戈,著一層夾襖步出監(jiān)牢的瞬間塌鸯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工唐片, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丙猬,地道東北人涨颜。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像茧球,于是被迫代替她去往敵國和親庭瑰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351