vue學(xué)習(xí)筆記

1.vue data屬性里面的getter和setter

data的每個(gè)屬性都有兩個(gè)相對(duì)應(yīng)的get和set屬性夯巷。

ES5的對(duì)象原型有兩個(gè)新的屬性__defineGetter__和__defineSetter__,專門用來(lái)給對(duì)象綁定get和set哀墓〕貌停可以這樣書寫:


vue雙向綁定原理是由數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式實(shí)現(xiàn)的。

vue的數(shù)據(jù)劫持是通過(guò)Object.defineProperty()來(lái)對(duì)對(duì)象的setter和getter屬性進(jìn)行操作麸祷,在數(shù)據(jù)進(jìn)行變動(dòng)時(shí)澎怒,進(jìn)行你想要的操作。

語(yǔ)法:Object.defineProperty(obj,prop,descriptor)

? ? ? ? ? ? 參數(shù):

? ? ? ? ? ? ? ? obj:要在其上定義屬性的對(duì)象阶牍。

? ? ? ? ? ? ? ? prop:要定義或修改的屬性名稱。

? ? ? ? ? ? ? ? descriptor:將被定義或修改的屬性描述星瘾。

? ? ? ? ? ? 返回值:

? ? ? ? ? ? ? ? ? 被傳遞給函數(shù)的對(duì)象走孽。

也就是說(shuō)他可以控制一個(gè)對(duì)象屬性的一些特有操作,比如讀寫或是否可枚舉等琳状,這里組要看set和get磕瓷。

2.vue.js計(jì)算屬性computed(getter,setter)

在Vue中,computed的屬性可以被視為是data一樣念逞,可以讀取和設(shè)置困食,因此在computed中可以分成getter和setter,一般情況下沒有setter翎承,computed預(yù)設(shè)只有g(shù)etter硕盹,也就是只能讀取,不能改變?cè)O(shè)值叨咖。

vue.js計(jì)算屬性默認(rèn)只有g(shù)etter瘩例,因?yàn)槭悄J(rèn)值所以我們也常常忽略不寫啊胶,如下代碼:

完整寫法:

計(jì)算屬性getter的出發(fā)時(shí)間:

如果我們改變上邊代碼里的2個(gè)輸入框的值firstName或則lastName,都會(huì)觸發(fā)computed以及updated()垛贤,也就是說(shuō)會(huì)執(zhí)行:console.log('computed')和console.log('updated')焰坪;

需要注意的是,不是說(shuō)我們更改了getter里使用的變量聘惦,就會(huì)觸發(fā)computed的更新某饰,前提是computed里的值必須要在模板里面使用才行。如果把上面代碼中的p標(biāo)簽注釋掉善绎,就算改變input的值也不會(huì)觸發(fā)computed黔漂。

2.vue生命周期。

1new Vue{

?????????router,

?????????store,

? ? ? ? ? //components: { App } vue1.0的寫法

????????????render: h => h(App) vue2.0的寫法

}).$mount('#app')

1.首先需要了解這是 es 6 的語(yǔ)法涂邀,表示 Vue 實(shí)例選項(xiàng)對(duì)象的 render 方法作為一個(gè)函數(shù)瘟仿,接受傳入的參數(shù) h 函數(shù),返回 h(App) 的函數(shù)調(diào)用結(jié)果比勉。

2.其次劳较,Vue 在創(chuàng)建 Vue 實(shí)例時(shí),通過(guò)調(diào)用 render 方法來(lái)渲染實(shí)例的 DOM 樹浩聋。

3.最后观蜗,Vue 在調(diào)用 render 方法時(shí),會(huì)傳入一個(gè) createElement 函數(shù)作為參數(shù)衣洁,也就是這里的 h 的實(shí)參是 createElement 函數(shù)墓捻,然后 createElement 會(huì)以 APP 為參數(shù)進(jìn)行調(diào)用,關(guān)于 createElement 函數(shù)的參數(shù)說(shuō)明參見:Element-Arguments坊夫。


先了解一下vue的虛擬dom:

Vitual DOM是一種虛擬dom技術(shù)砖第,本質(zhì)上是基于javascript實(shí)現(xiàn)的,相對(duì)于dom對(duì)象环凿,javascript對(duì)象更簡(jiǎn)單梧兼,處理速度更快,dom樹的結(jié)構(gòu)智听,屬性信息都可以很容易的用javascript對(duì)象表示:

Virtual DOM并沒有完全實(shí)現(xiàn)DOM羽杰,最主要還是保留了Element之間的層次關(guān)系和一些基本屬性。你給我一個(gè)數(shù)據(jù)到推,我根據(jù)數(shù)據(jù)生成一個(gè)全新的Virtual DOM考赛,然后跟我上一次生成的Virtual DOM去diff,然后通過(guò)patch方法掛載莉测。

我們可以通過(guò)javascript對(duì)象表示的樹結(jié)構(gòu)來(lái)構(gòu)建真正的DOM樹颜骤,當(dāng)數(shù)據(jù)發(fā)聲變化時(shí),可以直接修改這個(gè)javascript對(duì)象悔雹,接著對(duì)比修改后的對(duì)象复哆,記錄下需要對(duì)頁(yè)面做的dom操作欣喧,然后將其應(yīng)用到真正的DOM樹,實(shí)現(xiàn)視圖的更新梯找。

VNode生成最關(guān)鍵點(diǎn)是通過(guò)render函數(shù)唆阿,由2種生成方式,第一種是直接在vue對(duì)象的option種添加render字段锈锤。第二種是寫一個(gè)模板或指定el跟元素驯鳖,它會(huì)首先轉(zhuǎn)換成模板,經(jīng)過(guò)html語(yǔ)法解析器生成一個(gè)ast抽象語(yǔ)法樹久免,對(duì)語(yǔ)法樹做優(yōu)化浅辙,然后把語(yǔ)法樹轉(zhuǎn)換成代碼片段,最后通過(guò)代碼片段生成function添加到option的render字段中阎姥。

? ? ast語(yǔ)法優(yōu)化過(guò)程记舆,主要做了2件事:

? ? ? ? 1.會(huì)檢測(cè)出靜態(tài)的class名和attributes,這樣它們?cè)诔跏蓟秩竞笥肋h(yuǎn)不會(huì)再被對(duì)比了呼巴。

? ? ? ? 2.會(huì)檢測(cè)出最大的靜態(tài)子樹泽腮,并且從渲染函數(shù)中萃取出來(lái)。這樣在每次重渲染時(shí)衣赶,它們會(huì)直接重用相同的vnode诊赊,同時(shí)跳過(guò)比對(duì)。

creteelment方法的功能是給一個(gè)Vnode對(duì)象添加若干個(gè)Vnode府瞄,因?yàn)檎麄€(gè)Vritual DOM是一種樹狀結(jié)構(gòu)碧磅,每個(gè)節(jié)點(diǎn)都可能會(huì)有若干子節(jié)點(diǎn)。然后創(chuàng)建一個(gè)Vnode對(duì)象遵馆,如果是一個(gè)reserved tag(html,head等一些合法的html標(biāo)簽)則會(huì)創(chuàng)建普通的DOM Vnode鲸郊,如果是一個(gè)component tag(通過(guò)vue注冊(cè)的自定義component),則會(huì)創(chuàng)建Component Vnode對(duì)象货邓,它的VnodeComponentOptions不為null严望。

function patch(oldVnode, vnode, hydrating, removeOnly, parentElm, refElm){

創(chuàng)建好Vnode,下一步就是要把虛擬dom渲染成真正的dom逻恐,是通過(guò)patch來(lái)實(shí)現(xiàn)。patch支持3個(gè)參數(shù)峻黍,其中oldNode是一個(gè)真實(shí)DOM或則一個(gè)Vnode對(duì)象复隆,它表示當(dāng)前的VNode,vnode是VNode對(duì)象類型,它表示待替換的VNode,hydration是bool類型姆涩,它表示是否直接使用服務(wù)器端渲染的DOM元素挽拂,下面流程圖表示patch的運(yùn)行邏輯:

patch運(yùn)行邏輯看上去比較復(fù)雜,有2個(gè)方法createElm和patchVnode是生成dom的關(guān)鍵.

createElm方法會(huì)根據(jù)vnode的數(shù)據(jù)結(jié)構(gòu)創(chuàng)建真實(shí)的DOM節(jié)點(diǎn)骨饿,如果vnode有children亏栈,則會(huì)遍歷這些子節(jié)點(diǎn)台腥,遞歸調(diào)用createElm方法,InsertedVnodeQueue是記錄子節(jié)點(diǎn)創(chuàng)建順序的隊(duì)列绒北,每創(chuàng)建一個(gè)DOM元素就會(huì)往這個(gè)隊(duì)列中插入當(dāng)前的VNode,當(dāng)整個(gè)VNode對(duì)象全部轉(zhuǎn)換成為真實(shí)的DOM樹時(shí)黎侈,會(huì)依次調(diào)用這個(gè)隊(duì)列中的VNode hook的insert方法

1.了解vue的$mount所作的工作大體分為3部:

? ? 1.如果你的option里面沒有render函數(shù),那么闷游,通過(guò)complieToFunctions將HTML模板編譯成可以生成VNode的Render函數(shù)峻汉。

? ? 2.new一個(gè)Watcher實(shí)例,觸發(fā)updateComponent方法脐往。

? ? 3.生成vnode休吠,經(jīng)過(guò)path,把vnode更新到dom上业簿。

從上面的代碼中可以看到瘤礁,首先判斷option里面有沒有render函數(shù),沒有的話梅尤,進(jìn)一步判斷有沒有template柜思,沒有的話就用dom元素的outerHTML。得到template以后干了什么呢克饶?如下圖:

我們可以看到酝蜒,調(diào)用了complieToFunction將template轉(zhuǎn)成render函數(shù)。這里面有兩個(gè)過(guò)程:

將template解析成ast語(yǔ)法樹矾湃。

通過(guò)ast語(yǔ)法樹生成render函數(shù)亡脑。

下一步就開始mountConmponet了。

從上圖可以看出邀跃,程序聲明了一個(gè)updateComponent 方法霉咨,這個(gè)是將要被Watcher實(shí)例調(diào)用的更新組件的方法。


vm:當(dāng)前的vm實(shí)例拍屑。

updateComponent 這個(gè)非常重要途戒,用來(lái)在后面將vnode更新到dom上。

noop無(wú)意義的函數(shù)僵驰。

null option選項(xiàng)沒有則為null喷斋。

true主要是用來(lái)判斷是哪個(gè)watcher。因?yàn)閏omputed計(jì)算屬性和如果你要在options里面配置watch了同樣也是使用了 new Watcher 蒜茴,加上這個(gè)用以區(qū)別這三者星爪。

if(isRenderWatcher) {

?????vm._watcher = this;

}

可以看到,如果聲明這個(gè)watcher的上下文是用來(lái)渲染視圖的粉私,也就是說(shuō)在mountComponent這里調(diào)用new Watcher的時(shí)候顽腾,才會(huì)把this賦值給_watcher。然后把 watcher push到 _watchers 里面诺核,目的是等到組件銷毀時(shí)順便把watcher也銷毀掉抄肖。

接下來(lái)久信,就是賦值給 getter , this.getter = expOrFn 。還記得剛才傳過(guò)來(lái)的 updateComponent 函數(shù)么漓摩,沒錯(cuò)裙士,就是這個(gè)賦值給我 getter 。然后我們就到了:

我們可以看到幌甘,首先它執(zhí)行的是 pushTarget(this) ,pushTarget(this) 代碼如下:

也就是說(shuō)如果當(dāng)前有 Dep.target 的話潮售,就把target放到 targetStack 里面,如果沒有的話锅风,就設(shè)為當(dāng)前的target酥诽,也就是這個(gè)watcher。 接著皱埠,就是執(zhí)行了它的 getter 屬性肮帐,也就是剛剛傳入 updateComponent 函數(shù)。


官方vue生命周期圖:

從圖可以看出在vue整個(gè)的生命周期中會(huì)有很多的鉤子函數(shù)边器,提供給我們?cè)趘ue生命周期不同的時(shí)刻進(jìn)行操作训枢。沒一個(gè)組件或則實(shí)例都會(huì)經(jīng)歷一個(gè)完整的生命周期,總共分為三個(gè)階段:初始化忘巧、運(yùn)行中恒界、銷毀。

? ? 1.實(shí)例砚嘴、組件通過(guò)new Vue()創(chuàng)建出來(lái)之后會(huì)初始化事件和生命周期十酣,然后會(huì)執(zhí)行beforeCreted鉤子函數(shù),這個(gè)時(shí)候數(shù)據(jù)還沒有掛載际长,只是一個(gè)空殼耸采,無(wú)法訪問到數(shù)據(jù)和真實(shí)的dom,一般不做操作工育。

? ? 2.掛載數(shù)據(jù)虾宇,綁定事件等等,然后執(zhí)行creted函數(shù)如绸,這個(gè)時(shí)候已經(jīng)可以只用到數(shù)據(jù)嘱朽,也可以更改數(shù)據(jù),在這里更改數(shù)據(jù)不會(huì)觸發(fā)updated函數(shù)怔接,在這里可以在渲染前倒數(shù)第二次更改數(shù)據(jù)的機(jī)會(huì)燥翅,不會(huì)觸發(fā)其它鉤子函數(shù),一般可以在這里做初始數(shù)據(jù)的獲取蜕提。

? ? 3.接下來(lái)開始找實(shí)例或則組建對(duì)應(yīng)的模板,編譯模板為虛擬dom放入到render函數(shù)中準(zhǔn)備渲染靶端,然后執(zhí)行beforeMount鉤子函數(shù)谎势,在這個(gè)函數(shù)中虛擬dom已經(jīng)創(chuàng)建完成凛膏,馬上就要渲染,在這里可以更改數(shù)據(jù)脏榆,不會(huì)觸發(fā)updated猖毫,在這里可以在渲染前最后一次更改數(shù)據(jù)的機(jī)會(huì)。

? ? 4.接下來(lái)開始render须喂,渲染出真實(shí)dom吁断,然后執(zhí)行mounted鉤子函數(shù),此時(shí)坞生,組件已經(jīng)出現(xiàn)在頁(yè)面中仔役,數(shù)據(jù)、真實(shí)dom都已經(jīng)處理好了是己,事件都已經(jīng)掛載好了又兵,可以在這里操作真實(shí)dom。

? ? 5.當(dāng)組件或?qū)嵗臄?shù)據(jù)更改之后卒废,會(huì)立即執(zhí)行beforeUpdate沛厨,然后vue的虛擬dom機(jī)制就會(huì)重新構(gòu)建虛擬dom樹利用diff算法進(jìn)行對(duì)比后重新渲染。

? ? 6.當(dāng)更新完成后摔认,執(zhí)行updated逆皮,數(shù)據(jù)已經(jīng)更改完成,dom也重新render完成参袱,可以操作更新后的虛擬dom电谣。

? ? 7.當(dāng)經(jīng)過(guò)某種途徑調(diào)用$destroy方法后,立即執(zhí)行beforeDestroy蓖柔,一般在這里做一些善后工作辰企,例如清除計(jì)時(shí)器、清除非指令綁定的事件等等

????8.組件的數(shù)據(jù)綁定况鸣、監(jiān)聽...去掉后只剩下dom空殼牢贸,這個(gè)時(shí)候靶草,執(zhí)行destroyed舆蝴,在這里做善后工作也可以

先列出所有的鉤子函數(shù),再一一詳解:

? ? *beforeCreate

? ? *created

? ? *beforeMount

? ? *mounted

? ? *beforeUpdate

? ? *updated

? ? *beforeDsetroy

? ? *destroyed

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末横辆,一起剝皮案震驚了整個(gè)濱河市懂酱,隨后出現(xiàn)的幾起案子竹习,更是在濱河造成了極大的恐慌,老刑警劉巖列牺,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件整陌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)泌辫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門随夸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人震放,你說(shuō)我怎么就攤上這事宾毒。” “怎么了殿遂?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵诈铛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我墨礁,道長(zhǎng)幢竹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任饵溅,我火速辦了婚禮妨退,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜕企。我一直安慰自己咬荷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布轻掩。 她就那樣靜靜地躺著幸乒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唇牧。 梳的紋絲不亂的頭發(fā)上罕扎,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音丐重,去河邊找鬼腔召。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扮惦,可吹牛的內(nèi)容都是我干的臀蛛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼崖蜜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浊仆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起豫领,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抡柿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后等恐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洲劣,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡备蚓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闪檬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片星著。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粗悯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情同欠,我是刑警寧澤样傍,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站铺遂,受9級(jí)特大地震影響衫哥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜襟锐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一撤逢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粮坞,春花似錦蚊荣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至筝闹,卻和暖如春媳叨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背关顷。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工糊秆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人议双。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓痘番,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親聋伦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夫偶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • vue學(xué)習(xí)筆記 安裝 Vue 提供一個(gè)官方命令行工具,可用于快速搭建大型單頁(yè)應(yīng)用觉增。只需幾分鐘即可創(chuàng)建并啟動(dòng)一個(gè)帶熱...
    EL_PSY_CONGROO閱讀 1,066評(píng)論 0 5
  • vue對(duì)比jquery vue:mvvm 數(shù)據(jù)驅(qū)動(dòng)影響視圖 適用于復(fù)雜數(shù)據(jù)jquery:mvc 視圖塞入數(shù)據(jù) ...
    34sir閱讀 3,017評(píng)論 1 2
  • 序言:亂七八糟一鍋粥兵拢! 基于Vue.js 教程、介紹— Vue.js 心得: 在vue中逾礁,推薦始終使用 kebab...
    苦苦修行閱讀 651評(píng)論 0 1
  • .$data .#$el $data表示vue實(shí)例中data的值$el表示vue實(shí)例中el的值,注意 el效果等...
    李諾哦閱讀 833評(píng)論 0 0
  • 獅子座人常有個(gè)人英雄主義情結(jié),希望永遠(yuǎn)在關(guān)系中處于主角腻扇,以“為你好”债热、“我說(shuō)的都是對(duì)的”的借口,“管教”身邊人幼苛,讓...
    星群公社閱讀 919評(píng)論 0 2