Vue2和Vue3的區(qū)別

vue2 vs vue3

對比 vue2 vue3
腳手架 命令式 可視化創(chuàng)建腳?架
組件通信 見下文 見下文
數(shù)據(jù)監(jiān)聽 watch,computed watch,watchEffect,computed
雙向綁定 Object.defineProperty ProxyAPI
?命周期 見下文 見下文
api 選項式 組合式

雙向綁定更新

vue2 的雙向數(shù)據(jù)綁定是利?ES5 的?個 API ,Object.defineProperty()對數(shù)據(jù)進(jìn)?劫持 結(jié)合 發(fā)布訂閱模式的?式來實現(xiàn)的。

vue3 中使?了 ES6 的 ProxyAPI 對數(shù)據(jù)代理,通過 reactive() 函數(shù)給每?個對象都包?層 Proxy,通過 Proxy 監(jiān)聽屬性的變化,從? 實現(xiàn)對數(shù)據(jù)的監(jiān)控。

這?是相?于vue2版本,使?proxy的優(yōu)勢如下

1.defineProperty只能監(jiān)聽某個屬性崎淳,不能對全對象監(jiān)聽 可以省去for in、閉包等內(nèi)容來提升效率(直接綁定整個對象即可)

2.可以監(jiān)聽數(shù)組愕把,不?再去單獨的對數(shù)組做特異性操作,通過Proxy可以直接攔截所有對象類型數(shù)據(jù)的操作拣凹,完美?持對數(shù)組的監(jiān)聽森爽。

實例化

Vue2.x中new出的實例對象,所有的東西都在這個vue對象上嚣镜,這樣其實?論你?到還是沒?到爬迟,都會跑?遍,這樣不僅提?了性能消耗祈惶,也?疑增加了?戶加載時間雕旨。

?vue3.0中可以?ES module imports按需引?,如:keep-alive內(nèi)置組件捧请、v-model指令凡涩,等等,不僅我們開發(fā)起來更加的便捷疹蛉,減少 了內(nèi)存消耗活箕,也同時減少了?戶加載時間,優(yōu)化?戶體驗可款。

生命周期

引用掘金圖片如下:

獲取props

vue2在script代碼塊可以直接獲取props育韩,vue3通過setup指令傳遞

vue2:console.log('props',this.xxx)
vue3:setup(props,context){ console.log('props',props) }

數(shù)據(jù)和方法的定義

Vue2使?的是選項類型API(Options API),Vue3使?的是合成型API(Composition API)

Vue2:

data() { return {}; }, methods:{ }

Vue3:

數(shù)據(jù)和?法都定義在setup中闺鲸,并統(tǒng)?進(jìn)?return{}

給父組件傳值emit

vue2:this.$emit()
vue3:setup(props,context){context.emit()}

watchEffect

Vue3中除了watch筋讨,還引入了副作用監(jiān)聽函數(shù)watchEffect,用過之后我發(fā)現(xiàn)它和React中的useEffect很像摸恍,只不過watchEffect不需要傳入依賴項悉罕。

那么什么是watchEffect呢?

watchEffect它會立即執(zhí)行傳入的一個函數(shù)立镶,同時響應(yīng)式追蹤其依賴壁袄,并在其依賴變更時重新運行該函數(shù)。

computed和watch所依賴的數(shù)據(jù)必須是響應(yīng)式的媚媒。

Vue3引入了watchEffect嗜逻,watchEffect 相當(dāng)于將 watch 的依賴源和回調(diào)函數(shù)合并,當(dāng)任何你有用到的響應(yīng)式依賴更新時缭召,該回調(diào)函數(shù)便會重新執(zhí)行栈顷。

不同于 watch的是watchEffect的回調(diào)函數(shù)會被立即執(zhí)行,即({ immediate: true })嵌巷。

組件通信

注意

props中數(shù)據(jù)流是單項的萄凤,即子組件不可改變父組件傳來的值

在組合式API中,如果想在子組件中用其它變量接收props的值時需要使用toRef將props中的屬性轉(zhuǎn)為響應(yīng)式晴竞。

attrs和listeners

子組件使用$attrs可以獲得父組件除了props傳遞的屬性和特性綁定屬性 (class和 style)之外的所有屬性。

子組件使用$listeners可以獲得父組件(不含.native修飾器的)所有v-on事件監(jiān)聽器狠半,在Vue3中已經(jīng)不再使用噩死;

但是Vue3中的attrs不僅可以獲得父組件傳來的屬性也可以獲得父組件v-on事件監(jiān)聽器

路由

vue3和vue2路由常用功能只是寫法上有些區(qū)別:

vue3的beforeRouteEnter作為路由守衛(wèi)的示例是因為它在setup語法糖中是無法使用的颤难;

大家都知道setup中組件實例已經(jīng)創(chuàng)建,是能夠獲取到組件實例的已维。

beforeRouteEnter是再進(jìn)入路由前觸發(fā)的行嗤,此時組件還未創(chuàng)建,所以是無法用在setup中的垛耳;如果想在setup語法糖中使用則需要再寫一個script 如下:

<script>
export default {
  beforeRouteEnter(to, from, next) {
    // 在渲染該組件的對應(yīng)路由被 confirm 前調(diào)用
    next()
  },
};
</script>

vue3路由寫法:

<script>
import { defineComponent } from 'vue'
import { useRoute, useRouter } from 'vue-router'
export default defineComponent({
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對應(yīng)路由被 confirm 前調(diào)用
    next()
  },
  beforeRouteLeave ((to, from, next)=>{//離開當(dāng)前的組件栅屏,觸發(fā)
    next()       
  }),
  beforeRouteLeave((to, from, next)=>{//離開當(dāng)前的組件,觸發(fā)
    next()      
  }),
  setup() {
    const router = useRouter()
    const route = useRoute()
    const toPage = () => {
      router.push(xxx)
    }
    //獲取params 注意是route
    route.params
    //獲取query
    route.query
    return {
      toPage
    }
  },
});
</script>

vue2寫法:

<script>
export default {
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對應(yīng)路由被 confirm 前調(diào)用
    next()
  },
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對應(yīng)路由被 confirm 前調(diào)用
    next()
  },
  beforeRouteLeave ((to, from, next)=>{//離開當(dāng)前的組件堂鲜,觸發(fā)
    next()       
  }),
  beforeRouteLeave((to, from, next)=>{//離開當(dāng)前的組件栈雳,觸發(fā)
    next()      
  }),
  methods:{
    toPage(){
      //路由跳轉(zhuǎn)
      this.$router.push(xxx)
    }
  },
  created(){
    //獲取params
    this.$route.params
    //獲取query
    this.$route.query
  }
}
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缔莲,隨后出現(xiàn)的幾起案子哥纫,更是在濱河造成了極大的恐慌,老刑警劉巖痴奏,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛀骇,死亡現(xiàn)場離奇詭異,居然都是意外死亡读拆,警方通過查閱死者的電腦和手機擅憔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門顿膨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來世澜,“玉大人,你說我怎么就攤上這事收捣∶藿悖” “怎么了屠列?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伞矩。 經(jīng)常有香客問我笛洛,道長,這世上最難降的妖魔是什么乃坤? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任苛让,我火速辦了婚禮,結(jié)果婚禮上湿诊,老公的妹妹穿的比我還像新娘狱杰。我一直安慰自己,他們只是感情好厅须,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布仿畸。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪错沽。 梳的紋絲不亂的頭發(fā)上簿晓,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音千埃,去河邊找鬼憔儿。 笑死,一個胖子當(dāng)著我的面吹牛放可,可吹牛的內(nèi)容都是我干的谒臼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼耀里,長吁一口氣:“原來是場噩夢啊……” “哼蜈缤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起备韧,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤劫樟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后织堂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叠艳,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年易阳,在試婚紗的時候發(fā)現(xiàn)自己被綠了附较。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡潦俺,死狀恐怖拒课,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情事示,我是刑警寧澤早像,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站肖爵,受9級特大地震影響卢鹦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜劝堪,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一冀自、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秒啦,春花似錦熬粗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灌诅。三九已至,卻和暖如春含末,著一層夾襖步出監(jiān)牢的瞬間延塑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工答渔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侥涵。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓沼撕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芜飘。 傳聞我的和親對象是個殘疾皇子务豺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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