首先,我因為不太常用眼藥水,所以,有關於眼睛酸澀流目油等事情,請不要來問我謝謝。至於是不是有這麼多雷,其實我也不太確定,只是我遇到了而已。
如果你沒有,那應該是我眼睛乾澀看錯,假的!
關於 Lifecycle Diagram
舉一個 1.x 的例子來看,先抽離 vue-router
的狀況,實際上在瀏覽器上觸發的狀況大概就是官方的順序(底下先不討論離開畫面的東西,
init
created
beforeCompile
compiled
attached
ready
各別帶出來的 this
則是這樣,
- VueComponent,但是
$el
還沒有任何元件,是null
- 同上
$el
被綁進來了- 準備進入
transition
- 進入
transition-enter
階段 - 同上
雷在哪?
-
由於 DOM 會先被渲染,如果有額外拿資料的動作(例如 Ajax 之類的事情,必須要在
data()
當中先給預設值,不然會噴一堆Warning
給你(你要無視也行 -
如果要操作
$el
的話,必須要等beforeCompiled
之後,如果是第三方套件,有的還必須要ready
之後,加上setTimeout
才有效 -
進入
transition
階段的地方,如果更改style
小心畫面抽風(就是一大堆transform
之類的事情
如果有 Vue-Router
一樣是以 1.x 為例子,基本上不算是什麼雷,不過有些小地方要留意,同樣的實際瀏覽器觸發情況我們來看一下,
- VueRouter
canActivate
- VueComponent
init
- VueComponent
created
- VueComponent
beforeCompile
- VueComponent
compiled
- VueRouter
activate
- VueRouter
data
- VueComponent
attached
- VueComponent
ready
同時帶出的 this
大概是這樣,
null
- VueComponent,但是
$el
還沒有任何元件,是null
- 同上
$el
被綁進來了- 準備進入
transition
- 同上
- 同上
- 進入
transition-enter
階段 - 同上
雷在哪?
記得 Vue-Router 有個東西叫做
waitForData: true
嗎?
如果啟用了這個,當 data
還在拿資料的時候,畫面渲染可能會出點問題。由於元件覆用的關係,所以畫面上的某些部分會被重新渲染,而其實畫面並不會切換到新頁面去,舉個例子來說,
- A 畫面使用了
waitForData: true
- 我們直接瀏覽 B 畫面
- 再從 B -> A
- 這個時候,由於 A 有
waitForData: true
,所以 A 畫面的資料不會被渲染,所以瀏覽器可能會先停留在 B 畫面 - 這時候 B 畫面上面的 DOM 可能會被 A 畫面的 DOM 污染
這是蠻特殊的情況,但是我就是遇到了。
解決的方法是,不要使用 waitForData: true
,讓取得資料的部分還是由 data
接手沒關係,主要是不使用 waitForData: true
的話,畫面會切回 A 畫面然後直接渲染出來,雖然畫面上的資料會是空的,不過總比畫面抽風來的好。
小計
我還是多買點眼藥水來點比較實際。