一执泰、生命周期的變化
1龙屉、創(chuàng)建前:beforeCreate 升級成 使用setup()
2许起、創(chuàng)建后:created 升級成 使用setup()
3相速、掛載前:beforeMount 升級成 onBeforeMount
4碟渺、掛載后:mounted 升級成 onMounted
5、更新前:beforeUpdate 升級成 onBeforeUpdate
6突诬、更新后:updated 升級成 onUpdated
7苫拍、銷毀前:beforeDestroy 升級成 onBeforeUnmount
8、銷毀后:destroyed 升級成 onUnmounted
9旺隙、異常捕獲:errorCaptured 升級成 onErrorCaptured
10绒极、被激活:onActivated 被包含在<keep-alive>中的組件,會多出兩個生命周期鉤子函數(shù)蔬捷。被激活時執(zhí)行垄提。
11、切換:onDeactivated 比如從 A 組件周拐,切換到 B 組件铡俐,A 組件消失時執(zhí)行
二、v-if和v-for的優(yōu)先級
1妥粟、在vue2中v-for的優(yōu)先級高于v-if审丘,可以放在一起使用,但是不建議這么做勾给,會帶來性能上的浪費(fèi)
2滩报、在vue3中v-if的優(yōu)先級高于v-for,一起使用會報錯播急∨Ъ兀可以通過在外部添加一個標(biāo)簽,將v-for移到外層
三桩警、diff算法
1可训、vue2中的diff算法
遍歷每一個虛擬節(jié)點(diǎn),進(jìn)行虛擬節(jié)點(diǎn)對比捶枢,并返回一個patch對象握截,用來存儲兩個節(jié)點(diǎn)不同的地方。
用patch記錄的消息去更新dom
缺點(diǎn):比較每一個節(jié)點(diǎn)柱蟀,而對于一些不參與更新的元素,進(jìn)行比較是有點(diǎn)消耗性能的蚜厉。
特點(diǎn):特別要提一下Vue的patch是即時的长已,并不是打包所有修改最后一起操作DOM,也就是在vue中邊記錄變更新。(React則是將更新放入隊(duì)列后集中處理)术瓮。
2康聂、vue3中的diff算法
在初始化的時候會給每一個虛擬節(jié)點(diǎn)添加一個patchFlags,是一種優(yōu)化的標(biāo)識胞四。
只會比較patchFlags發(fā)生變化的節(jié)點(diǎn)恬汁,進(jìn)行識圖更新。而對于patchFlags沒有變化的元素作靜態(tài)標(biāo)記辜伟,在渲染的時候直接復(fù)用氓侧。
四、?響應(yīng)式原理不同
1导狡、vue2通過Object.definedProperty()的get()和set()來做數(shù)據(jù)劫持约巷、結(jié)合和發(fā)布訂閱者模式來實(shí)現(xiàn),Object.definedProperty()會遍歷每一個屬性旱捧。
2独郎、vue3通過proxy代理的方式實(shí)現(xiàn)。proxy不需要像Object.definedProperty()的那樣遍歷每一個屬性枚赡,有一定的性能提升proxy可以理解為在目標(biāo)對象之前架設(shè)一層“攔截”氓癌,外界對該對象的訪問都必須通過這一層攔截。這個攔截可以對外界的訪問進(jìn)行過濾和改寫贫橙。
當(dāng)屬性過多的時候利用Object.definedProperty()要通過遍歷的方式監(jiān)聽每一個屬性贪婉。利用proxy則不需要遍歷,會自動監(jiān)聽所有屬性料皇,有利于性能的提升谓松。
五. 插槽方式不同
Vue2和Vue3具名插槽使用方式不同:vue2使用slot='',vue3使用v-slot:''
作用域插槽使用方式不同:vue2中在父組件中使用slot-scope="data"從子組件獲取數(shù)據(jù)践剂,vue3中在父組件中使用 #data 或者 #default="{data}"獲取
六鬼譬、樣式穿透
此處的樣式穿透,官方叫做深度選擇器逊脯。就是在我們想穿透的選擇器前邊添加 >>> 或者 /deep/ 或者 ::v-deep优质。比如說父組件中修改子組件的樣式。
在vue開發(fā)過程中军洼,當(dāng)我們引入第三方組件庫時(如使用element-ui)巩螃,需要在局部組件中修改第三方組件庫樣式,而又不想去除scoped屬性造成組件之間的樣式覆蓋匕争。這時我們可以通過一些方法穿透scoped避乏。
1、vue2中:
/deep/ .類名{}
::v-deep .類名{}
例: ::v-deep .el-tag--warning{
? ? ? ? color: #e6a23c;
? ? ??}
2甘桑、vue3中:
:deep (.類名{})
::v-deep(.類名{})