vue源碼學(xué)習(xí)--響應(yīng)式原理

使用Vue.js已經(jīng)有一段時(shí)間了俭驮,為了更好的理解它的原理葛家,最近在理解Vue.js的源碼名挥,Vue.js上手比較簡(jiǎn)單肃拜。Vue.js的響應(yīng)式原理依賴Object.definePropperty,這也是Vue不支持ie8一下版本的原因,Vue通過(guò)設(shè)定對(duì)象屬性的setter/getter方法來(lái)監(jiān)聽數(shù)據(jù)的變化真朗,通過(guò)getter進(jìn)行依賴收集,而每個(gè)setter方法就是一個(gè)觀察者僧诚,數(shù)據(jù)變化的時(shí)候通知訂閱者更新視圖遮婶。

將數(shù)據(jù)data變成可觀察(observable)

Vue是怎么把所有data下面的屬性變成可觀察的(observable)呢

function observer(value, cb) {
    Object.keys(value).forEach((key) => defineReactive(value, key, value[key] , cb))
}

function defineReactive (obj, key, val, cb) {
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get: ()=>{
            /*....依賴收集等....*/
            /*Github:https://github.com/answershuto*/
        },
        set:newVal=> {
            cb();/*訂閱者收到消息的回調(diào)*/
        }
    })
}

class Vue {
    constructor(options) {
        this._data = options.data;
        observer(this._data, options.render)
    }
}

let app = new Vue({
    el: '#app',
    data: {
        text: 'text',
        text2: 'text2'
    },
    render(){
        console.log("render");
    }
})

為了便于理解,首先考慮一種最簡(jiǎn)單的情況湖笨,不考慮數(shù)組等情況旗扑,代碼如上所示。在initData中會(huì)調(diào)用observe這個(gè)函數(shù)將Vue的數(shù)據(jù)設(shè)置成observable的慈省。當(dāng)_data數(shù)據(jù)發(fā)生改變的時(shí)候就會(huì)觸發(fā)set臀防,對(duì)訂閱者進(jìn)行回調(diào)(在這里是render)

那么問(wèn)題來(lái)了,需要對(duì)app._data.text操作才會(huì)觸發(fā)set边败。為了偷懶袱衷,我們需要一種防病的方法通過(guò)app.text直接設(shè)置就能觸發(fā)set對(duì)視圖進(jìn)行重繪。那么就需要用到代理笑窜。

代理

我們可以在Vue的構(gòu)造函數(shù)constructor中為data執(zhí)行一個(gè)代理proxy致燥。這樣我們就把data上面的屬性代理到了vm實(shí)例上。

_proxy(options.data);/*構(gòu)造函數(shù)中*/

/*代理*/
function _proxy (data) {
    const that = this;
    Object.keys(data).forEach(key => {
        Object.defineProperty(that, key, {
            configurable: true,
            enumerable: true,
            get: function proxyGetter () {
                return that._data[key];
            },
            set: function proxySetter (val) {
                that._data[key] = val;
            }
        })
    });
}

我們就可以用app.text代替app._data.text了排截。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫌蚤,一起剝皮案震驚了整個(gè)濱河市辐益,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脱吱,老刑警劉巖智政,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異箱蝠,居然都是意外死亡续捂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門抡锈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疾忍,“玉大人,你說(shuō)我怎么就攤上這事床三∫徽郑” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵撇簿,是天一觀的道長(zhǎng)聂渊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)四瘫,這世上最難降的妖魔是什么汉嗽? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮找蜜,結(jié)果婚禮上饼暑,老公的妹妹穿的比我還像新娘。我一直安慰自己洗做,他們只是感情好弓叛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诚纸,像睡著了一般撰筷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畦徘,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天毕籽,我揣著相機(jī)與錄音,去河邊找鬼井辆。 笑死关筒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杯缺。 我是一名探鬼主播平委,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夺谁!你這毒婦竟也來(lái)了廉赔?” 一聲冷哼從身側(cè)響起肉微,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜡塌,沒(méi)想到半個(gè)月后碉纳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馏艾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年劳曹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琅摩。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铁孵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出房资,到底是詐尸還是另有隱情蜕劝,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布轰异,位于F島的核電站岖沛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搭独。R本人自食惡果不足惜婴削,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牙肝。 院中可真熱鬧唉俗,春花似錦、人聲如沸配椭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颂郎。三九已至吼渡,卻和暖如春容为,著一層夾襖步出監(jiān)牢的瞬間乓序,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工坎背, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留替劈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓得滤,卻偏偏與公主長(zhǎng)得像陨献,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子懂更,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容