關(guān)于vue常見的題目

1. 簡述vue響應(yīng)式原理

vue的3個核心類:
- Observer: 給對象的屬性添加getter/setter屬性泄鹏,用于依賴收集和派發(fā)更新
- Dep:用于收集當(dāng)前響應(yīng)式對象的依賴關(guān)系,每一個響應(yīng)式對象都有一個dep實例, dep.subs是一個watcher數(shù)組,當(dāng)數(shù)據(jù)變更時痰哨,會有dep.notify()通知各個watcher
- Watcher:觀察者對象鲁猩,有render watcher, computed watcher 和 user watcher。

* 什么時候觸發(fā)依賴收集:
1. initState , 對computed 屬性初始化時會觸發(fā)computed watcher 依賴收集
2. initState , 對監(jiān)聽屬性初始化時會觸發(fā)user watcher 依賴收集
3. render, render過程觸發(fā)render watcher

* 什么時候觸發(fā)派發(fā)更新
Obect.defineProperty
1. 組件中對響應(yīng)式數(shù)據(jù)進(jìn)行修改會觸發(fā)setter邏輯
2. dep.notify()
3. 遍歷所以subs,調(diào)用每一個watcher實例的update方法

原理總結(jié): 當(dāng)創(chuàng)建vue實例時,vue會遍歷data的屬性纵诞,observer給每一個屬性添加getter/setter對數(shù)據(jù)讀寫進(jìn)行劫持忙干,在getter中收集依賴器予,在setter中派發(fā)更新。所謂在getter中收集依賴捐迫,就是給當(dāng)前屬性添加dep, dep.subs里面收集依賴該屬性的組件乾翔,即一組watcher實例,每一個組件都有相應(yīng)的watcher實例弓乙;所謂在setter中派發(fā)更新末融,就是執(zhí)行當(dāng)前屬性的dep.notify方法,通過遍歷deps.subs暇韧,去執(zhí)行每一個watcher實例的update方法勾习,從而實現(xiàn)視圖的更新。

2. 計算屬性的原理

computed watcher, 計算屬性的監(jiān)聽器
computed watcher, 持有一個dep實例懈玻,通過dirty屬性標(biāo)記計算屬性是否需要重新求值
computed watcher依賴的值發(fā)生改變后就會通知訂閱的watcher進(jìn)行更新巧婶,對于computed watcher會將dirty設(shè)置為true,并進(jìn)行計算屬性方法的調(diào)用, 如:`computed: {test(){}}`

*computed所謂的緩存是什么崔梗?
計算屬性基于它的**響應(yīng)式**依賴澜汤,只有依賴發(fā)生改變時才會重新求值,當(dāng)依賴沒有任何改變時放妈,會拿以前的值而不會重新執(zhí)行計算方法湾盒,即所謂的緩存湿右。注意,只有依賴的屬性是響應(yīng)式的改變時才會觸發(fā)重新求值
* computed緩存的意義是什么罚勾?
當(dāng)計算方法內(nèi)部操作的耗時非常長的時候毅人,比如遍歷一個很大的數(shù)組

3. Vue.nextTick 原理

  • 用法:
Vue.nextTick(() => {
})
// 或
await Vue.nextTick()
// TODO
  • 理解:
    nextTick 是下一跳的意思吭狡,vue異步執(zhí)行DOM更新的,一旦觀察到數(shù)據(jù)變化丈莺,vue會啟動一個異步隊列划煮,而不是立即執(zhí)行,它會把同一個event loop中發(fā)生數(shù)據(jù)變化的watcher推進(jìn)隊列缔俄,這樣的好處是對一定時間內(nèi)發(fā)生多次變化的視圖可以去重弛秋。
    在下一步事件循環(huán)時,Vue會清空隊列俐载,進(jìn)行DOM更新
    開啟異步隊列的方式優(yōu)先級: promise.then>MutationObserve->setImmidiate>setTimeout(前面2個是微任務(wù)蟹略,后面2個是宏任務(wù),看瀏覽器支持哪一種)
    例如 this.xxx = 1122 并不會馬上更新DOM,而是在Vue清空異步隊列后才會更新
    執(zhí)行順序:
    如果使用微任務(wù)開啟異步隊列以及DOM的更新:宏任務(wù)-> 微任務(wù)隊列-> UI render (在微任務(wù)隊列里拿新的DOM瞎疼,這是OK的科乎,因為UI render之前其實已經(jīng)是新的DOM了,只是沒有顯示在瀏覽器界面上)
    如果使用宏任務(wù)開啟異步隊列: 宏任務(wù)-> UI render -> 宏任務(wù)(在第二個宏任務(wù)里去獲取新的DOM贼急,因為已經(jīng)渲染好了茅茂,所以可以拿到新的DOM)

  • 什么時候使用Vue.nextTick
    當(dāng)數(shù)據(jù)變化要進(jìn)行一個操作,而這個操作依賴因數(shù)據(jù)變化而變化的DOM太抓,這個操作就放在Vue.nextTick的回調(diào)里空闲,說白了就是要拿到更新后的DOM才可以進(jìn)行這個操作,也可以看出執(zhí)行vue.nextTick后我們可以拿到更新后的DOM

<template>
<div v-if="isShow" ref="test"></div>
</template>
...
async showDiv() {
  this.isShow = true
  console.log(this.$resf['test']) // undefined
  await Vue.nextick()
  console.log(this.$resf['test']) // 這里才拿到
  this.$resf['test'].xx() // 執(zhí)行依賴這個DOM的操作
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末走敌,一起剝皮案震驚了整個濱河市碴倾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掉丽,老刑警劉巖跌榔,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捶障,居然都是意外死亡僧须,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門项炼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來担平,“玉大人,你說我怎么就攤上這事锭部≡萋郏” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵拌禾,是天一觀的道長取胎。 經(jīng)常有香客問我,道長湃窍,這世上最難降的妖魔是什么扼菠? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任摄杂,我火速辦了婚禮坝咐,結(jié)果婚禮上循榆,老公的妹妹穿的比我還像新娘。我一直安慰自己墨坚,他們只是感情好秧饮,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泽篮,像睡著了一般盗尸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帽撑,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天泼各,我揣著相機與錄音,去河邊找鬼亏拉。 笑死扣蜻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的及塘。 我是一名探鬼主播莽使,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笙僚!你這毒婦竟也來了芳肌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤肋层,失蹤者是張志新(化名)和其女友劉穎亿笤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栋猖,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡净薛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掂铐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罕拂。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖全陨,靈堂內(nèi)的尸體忽然破棺而出爆班,到底是詐尸還是另有隱情,我是刑警寧澤辱姨,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布柿菩,位于F島的核電站,受9級特大地震影響雨涛,放射性物質(zhì)發(fā)生泄漏枢舶。R本人自食惡果不足惜懦胞,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凉泄。 院中可真熱鬧躏尉,春花似錦、人聲如沸后众。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒂誉。三九已至教藻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間右锨,已是汗流浹背括堤。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绍移,地道東北人悄窃。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像登夫,于是被迫代替她去往敵國和親广匙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344