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