本篇為官方文件 Migration from Vue 2 筆記。
生命週期
destroyed生命週期選項被重命名為unmounted;beforeDestroy生命週期選項被重命名為beforeUnmount。
另外,$destroy 實體方法已從 Vue 3.0 中移除。
在 prop 的預設函式中訪問 this
Vue 3.x 的 prop 預設值的工廠函式不再有訪問 this 的權限。
替代方案:
- 把元件接收到的原始 prop 作為參數傳遞給預設函式;
injectAPI 可以在預設函式中使用。
|
|
自定義指令
Vue 3.x 對自定義指令的生命週期鉤子重新命名,與元件生命週期保持一致。
1. 2.x 語法
鉤子函式:
|
|
2. 3.x 語法
|
|
3. 鉤子函式參數
- 綁定元素的實體
instance從 Vue 2.x 的vnode移到了binding中; - Vue 3.x 移除
binding中的name、expression; - Vue 3.x 的
binding新增了dir,為一個物件,註冊指令時的物件選項。 - Vue 2.x 的
oldVnode改成了prevNnode。
Data 選項
data 選項不再接收純 object 形式,而需要使用 function 型式。
1. 2.x 語法
在 Vue 2.x 時,根實體上的 data 選項可以是純 object 形式:
|
|
元件的 data 選項則必須是 function 形式。
2. 3.x 語法只支持 function 形式
Vue 3.x 的 data 選項統一使用 function 形式。
|
|
3. Mixin 合併行為變更
若元件使用 mixin 或 extends,彼此的 data 選項會進行合併,Vue 2.x 是深拷貝合併,但 Vue 3.x 只進行 淺拷貝合併。
舉例來說:
|
|
Vue 2.x 生成 $data:
|
|
而 Vue 3.x 將會是:
|
|
因為 mixin 的深度合併非常隱式,這讓程式碼邏輯難以理解。
attribute 強制行為
- Vue 3.x 對於
contenteditable、draggable、spellcheck等 enumerated attribute 不再有特殊處理,將它們視為普通的 non-boolean attribute。 - 對於 non-boolean attribute 的值,若為
false將不再刪除 attribute,它會被設置成字串'false'。- 如果要移除 attribute 則需要使用
null或者undefined顯式刪除。
- 如果要移除 attribute 則需要使用
| 綁定值 | Vue 2.x non-boolean | Vue 2.x enumerated | Vue 3.x non-boolean | Vue 3.x enumerated | ||
|---|---|---|---|---|---|---|
null |
removed | "false" |
removed | removed | ||
undefined |
removed | removed | removed | removed | ||
true |
"true" |
"true" |
"true" |
"true" |
||
false |
removed | "false" |
"false" |
"false" |
||
"" |
"" |
"true" |
"" |
"" |
||
"true" |
"true" |
"true" |
"true" |
"true" |
||
"false" |
"false" |
"false" |
"false" |
"false" |
||
"foo" |
"foo" |
"true" |
"foo" |
"foo" |
||
0 |
"1" |
"true" |
"1" |
"1" |
||
1 |
"0" |
"true" |
"0" |
"0" |
Transition
- Transition 的部分 class 名稱更改。
<TransitionGroup>不再預設渲染包裹元素。
1. 部分 class 名稱更改
為了更加明確易讀,Vue 3.x 對初始狀態重命名:
v-enter修改為v-enter-fromv-leave修改為v-leave-from
對於 <transition> 元件相關屬性名稱也發生了變化:
leave-class已經被重命名為leave-from-classenter-class已經被重命名為enter-from-class
2. <TransitionGroup>
<transition-group> 不再預設渲染根元素,但仍然可以用 tag prop 建立根元素。
Vue 2.x 中,<transition-group> 與自定義元件一樣,需要一個根元素,預設為 <span>,可以透過 tag prop 更改:
|
|
Vue 3.x 有了 片段(Fragments),元件不再需要根節點,因此 <transition-group> 也不再預設渲染根節點。但仍然能透過 tag prop 添加。
Watch on Arrays
Vue 3.x 監聽陣列現在必須開啟 deep 選項。
1. 2.x 行為
監聽的 deep 選項在 Vue 2.x 只用於處理物件的深度監聽,對於陣列監聽並不需要特別設置 deep: true。
CodePen Demo:Vue 2.x - Watch on Arrays
2. 3.x 更新
Vue 3.x 則統一監聽物件處理,包括陣列也需設置 deep: true。
|
|
CodePen Demo:Vue 3.x - Watch on Arrays
<template> 相關
沒有特殊指令的標記(v-if/else-if/else、v-for 或 v-slot)的 <template> 現在被視為普通元素,並將生成原生的 <template> 元素,而不是渲染其內部內容。