摘要:注意重點(diǎn)是獲取更新后的就是在開發(fā)過程中有個(gè)需求是需要在階段操作數(shù)據(jù)更新后的節(jié)點(diǎn)這時(shí)候就需要用到就是用來知道什么時(shí)候更新完成原因在鉤子函數(shù)執(zhí)行的時(shí)候其實(shí)并未進(jìn)行任何渲染,而此時(shí)進(jìn)行操作無異于徒勞,所以在中一定要將操作的代碼放進(jìn)的回調(diào)函數(shù)中。
1. 最簡單的vue
el: dom節(jié)點(diǎn)
data: 數(shù)據(jù)
2. Vue 數(shù)據(jù)里的數(shù)組對象更新,但是視圖不更新 2.1 問題Vue 測試實(shí)例 - 菜鳥教程(runoob.com) {{ message }}
由于js的限制,Vue 不能檢測以上數(shù)組的變動(dòng),以及對象的添加/刪除,很多人會(huì)因?yàn)橄裆厦孢@樣操作,出現(xiàn)視圖沒有更新的問題。
2.2 解決辦法
this.$set(你要改變的數(shù)組/對象,你要改變的位置/key,你要改成什么value)
this.$set(this.arr, 0, "aa"); // 改變數(shù)組 this.$set(this.obj, "c", "cc"); // 改變對象
數(shù)組原生方法觸發(fā)視圖更新:
Vue可以監(jiān)測到數(shù)組變化的,數(shù)組原生方法:
splice()、 push()、pop()、shift()、unshift()、sort()、reverse()2.3實(shí)例
3. filter過濾器的作用Vue 測試實(shí)例 - 菜鳥教程(runoob.com) arr:{{arr}}
obj:{{obj}}
4. v-for與v-if優(yōu)先級(jí)Vue 測試實(shí)例 - 菜鳥教程(runoob.com) {{message | filterTest}}
v-if盡量不要與v-for在同一節(jié)點(diǎn)使用,因?yàn)関-for 的優(yōu)先級(jí)比 v-if 更高,如果它們處于同一節(jié)點(diǎn)的話,那么每一個(gè)循環(huán)都會(huì)運(yùn)行一遍v-if
如果你想根據(jù)循環(huán)中的每一項(xiàng)的數(shù)據(jù)來判斷是否渲染,那么你這樣做是對的:
如果你想要根據(jù)某些條件跳過循環(huán),而又跟將要渲染的每一項(xiàng)數(shù)據(jù)沒有關(guān)系的話,你可以將v-if放在v-for的父節(jié)點(diǎn):
// 數(shù)組是否有數(shù)據(jù) 跟每個(gè)元素沒有關(guān)系
No todos left!
正確使用v-for與v-if優(yōu)先級(jí)的關(guān)系,可以為你節(jié)省大量的性能。
5.vue生命周期 5.1 實(shí)例5.2 create和mounted{{ message }}
beforecreated:el 和 data 并未初始化
created:完成了 data 數(shù)據(jù)的初始化,el沒有
beforeMount:完成了 el 和 data 初始化
mounted :完成掛載
另外在標(biāo)綠處,我們能發(fā)現(xiàn)el還是 {{message}},這里就是應(yīng)用的 Virtual DOM(虛擬Dom)技術(shù),先把坑占住了。到后面mounted掛載的時(shí)候再把值渲染進(jìn)去。
5.3update 相關(guān) 5.4destroy有關(guān)于銷毀,暫時(shí)還不是很清楚。我們在console里執(zhí)行下命令對 vue實(shí)例進(jìn)行銷毀。銷毀完成后,我們再重新改變message的值,vue不再對此動(dòng)作進(jìn)行響應(yīng)了。但是原先生成的dom元素還存在,可以這么理解,執(zhí)行了destroy操作,后續(xù)就不再受vue控制了。
5.5 總結(jié)beforecreate : 舉個(gè)栗子:可以在這加個(gè)loading事件
created :在這結(jié)束loading,還做一些初始化,實(shí)現(xiàn)函數(shù)自執(zhí)行
mounted : 在這發(fā)起后端請求,拿回?cái)?shù)據(jù),配合路由鉤子做一些事情
beforeDestroy: 你確認(rèn)刪除XX嗎? destroyed :當(dāng)前組件已被刪除,清空相關(guān)內(nèi)容
5.6 參考https://segmentfault.com/a/11...
6.vue 為什么采用Virtual DOM創(chuàng)建真實(shí)DOM的代價(jià)高:真實(shí)的 DOM 節(jié)點(diǎn) node 實(shí)現(xiàn)的屬性很多,而 vnode 僅僅實(shí)現(xiàn)一些必要的屬性,相比起來,創(chuàng)建一個(gè) vnode 的成本比較低。
2.觸發(fā)多次瀏覽器重繪及回流:使用 vnode ,相當(dāng)于加了一個(gè)緩沖,讓一次數(shù)據(jù)變動(dòng)所帶來的所有 node 變化,先在 vnode 中進(jìn)行修改,然后 diff 之后對所有產(chǎn)生差異的節(jié)點(diǎn)集中一次對 DOM tree 進(jìn)行修改,以減少瀏覽器的重繪及回流
虛擬dom由于本質(zhì)是一個(gè)js對象,因此天生具備跨平臺(tái)的能力,可以實(shí)現(xiàn)在不同平臺(tái)的準(zhǔn)確顯示。
Virtual DOM 在性能上的收益并不是最主要的,更重要的是它使得 Vue 具備了現(xiàn)代框架應(yīng)有的高級(jí)特性。
例子
{ tag: "div", /*說明這是一個(gè)div標(biāo)簽*/ children: [ /*存放該標(biāo)簽的子節(jié)點(diǎn)*/ { tag: "a", /*說明這是一個(gè)a標(biāo)簽*/ text: "click me" /*標(biāo)簽的內(nèi)容*/ } ] }
渲染后可以得到
7. 組件data為什么必須是函數(shù)
因?yàn)椴皇褂胷eturn包裹的數(shù)據(jù)會(huì)在項(xiàng)目的全局可見,會(huì)造成變量污染
使用return包裹后數(shù)據(jù)中變量只在當(dāng)前組件中生效,不會(huì)影響其他組件
當(dāng)一個(gè)組件被定義, data 必須聲明為返回一個(gè)初始數(shù)據(jù)對象的函數(shù),因?yàn)榻M件可能被用來創(chuàng)建多個(gè)實(shí)例。如果 data 仍然是一個(gè)純粹的對象,則所有的實(shí)例將共享引用同一個(gè)數(shù)據(jù)對象!通過提供 data 函數(shù),每次創(chuàng)建一個(gè)新實(shí)例后,我們能夠調(diào)用 data 函數(shù),從而返回初始數(shù)據(jù)的一個(gè)全新副本數(shù)據(jù)對象。
8. 組件style的scoped為什么在組件中用js動(dòng)態(tài)創(chuàng)建的dom,添加樣式不生效
結(jié)果
// test生效 testAdd 不生效.test[data-v-1b971ada]{ // 注意data-v-1b971ada background:blue; height:100px; width:100px; }
原因
當(dāng)