瀏覽器啟用了懶載入機制,在除錯的時候,如果使用如下**先後列印同一物件,並且列印的時候未展開物件:
var person =
console.
log(person)
// 修改person的屬性
person.name =
'222'
console.
log(person)
兩次列印均是修改後的person:
person:
解決方法:1.使用json.stringify函式來列印
2.在列印完一次物件後立即在瀏覽器展開該物件
虛擬dom物件類似如下格式
var domobject =,]}]}
使用虛擬dom可以快速替換差異節點?
使用虛擬dom來對映真實的dom元素,如果產生了差異,採用diff演算法來比較差異,
然後通過js物件與dom樹的對映關係找到相應dom節點並將差異屬性替換即可
為什麼自定義物件來實現虛擬dom而不是直接使用getelement…而得到的dom物件?
如果直接使用dom物件,其屬性會有很多,記憶體消耗比較嚴重,而這種方式物件內只有部分屬性
首先是官方的vue生命週期流程圖:主要觀測一下五個引數
列印結果如下:
這裡可以看出,vue有例項,但是由於瀏覽器懶載入原因這裡列印的是例項化後的物件
如果使用json.stringfy(this),會報如下錯誤:
一般這種錯誤是因為vue例項中含有迴圈引用或者,比如
var a =
a.b = a
console.
log(
json
.stringfy
(a))
列印結果如下:
1. 引數注入 ------->資料data,監視,以及計算屬性等等--->掛載在vue根屬性上
2. 資料劫持物件(object.defineproperty方法),定義在$options.data中
如果在new vue時未定義el屬性,通過上面流程圖可以看出:
即使有template屬性,如果輸出vm.el仍
未und
efin
ed,因
為卡在了
vm.el仍未undefined,因為卡在了vm.
el仍未un
defi
ned,
因為卡在
了vm.
mount(el)呼叫
// 在new vue時未定義el屬性
var vm =
newvue(,
...}
) console.
log(vm.$el)
----
->undefined vue生命週期已經停止
vm.$mount()
----
>掛載el例項,vue生命週期繼續向下進行
console.
log(vm.$el)
----
>
/h1>
將模板掛載到vue的$el屬性後,通過判斷template模板是否含有,有兩個分支:
含有template模板:
以template作為render函式的值
不含有template模板:
編譯函式將模板編譯成虛擬dom,但是此時的虛擬dom僅僅是通過template而來的dom
如果同時具有template和el屬性,這一步$el會指向el屬性而不是template屬性,到了mounted才會被替換掉
虛擬dom和$el是分開的此時,elel指向的是頁面將要將虛擬dom生成的位置
所以下一步才會建立vm.$el並替換'el',這個後面的el就是此時指向的頁面位置
beforemount類似:
var element = document.
createelement
('div'
) vm.$el = element
mounted類似:
var rootelement = document.
getelementbyid
('demo'
) rootelement.
(element)
監聽資料data變化並重新渲染dom
銷毀vue例項
vue生命週期
beforecreate 元件例項剛剛被建立,屬性都沒有 create 例項已經建立完成,屬性已經繫結 beforemount 模板編譯之前 mounted 模板編譯之後 beforeupdate 元件更新之前 updated 元件更新完畢 beforedestroy 元件銷毀之前 destroye...
vue生命週期
vue把整個生命週期劃分為建立 掛載 更新 銷毀等階段,每個階段都會給一些 鉤子 讓我們來做一些我們想實現的動作。學習例項的生命週期,能幫助我們理解vue例項的運作機制,更好地合理利用各個鉤子來完成我們的業務 我們分別來看看這幾個階段 1.beforecreate 此階段為例項初始化之後,此時的資料...
Vue 生命週期
import vue from vue el root 沒有的話,使用render,繼續沒有,就把el的outerhtml編譯成模板 template temp data beforecreate created el是原來的el beforemount 渲染函式 render h this.tex...