我們在處理vue項(xiàng)目的時候牺蹄,可能會遇到數(shù)據(jù)變化,視圖并沒有實(shí)時渲染的情況~
當(dāng)你把一個普通的 JavaScript 對象傳給 Vue 實(shí)例的 data 選項(xiàng)薄翅,Vue 將遍歷此對象所有的屬性沙兰,并使用 Object.defineProperty 把這些屬性全部轉(zhuǎn)為 getter/setter。這些 getter/setter 對用戶來說是不可見的翘魄,但是在內(nèi)部它們讓 Vue 追蹤依賴鼎天,在屬性被訪問和修改時通知變化。
每個組件實(shí)例都有相應(yīng)的 watcher 實(shí)例對象暑竟,它會在組件渲染的過程中把屬性記錄為依賴斋射,之后當(dāng)依賴項(xiàng)的 setter 被調(diào)用時,會通知 watcher 重新計算但荤,從而致使它關(guān)聯(lián)的組件得以更新绩鸣。
一、數(shù)組數(shù)據(jù)變動纱兑,使用某些方法操作數(shù)組呀闻,變動數(shù)據(jù)時,有些方法無法被vue監(jiān)測潜慎,
push()捡多,pop()蓖康,shift(),unshift()垒手,splice()蒜焊,sort(),reverse()可被vue檢測到 科贬,filter(), concat(), slice() 泳梆。這些不會改變原始數(shù)組,但總是返回一個新數(shù)組榜掌。當(dāng)使用非變異方法時优妙,可以用新數(shù)組替換舊數(shù)組。
vue不能檢測以下變動的數(shù)組:
① 當(dāng)你利用索引直接設(shè)置一個項(xiàng)時憎账,vm.items[indexOfItem] = newValue
② 當(dāng)你修改數(shù)組的長度時套硼,例如: vm.items.length = newLength
二、對象屬性的添加或刪除胞皱。由于 Vue 會在初始化實(shí)例時對屬性執(zhí)行?getter/setter?轉(zhuǎn)化過程邪意,所以屬性必須在?data?對象上存在才能讓 Vue 轉(zhuǎn)換它,這樣才能讓它是響應(yīng)的反砌。
解決辦法:使用?Vue.set(object, key, value)?方法將響應(yīng)屬性添加到嵌套的對象上
Vue.set(vm.someObject, 'b', 2)? 或者? this.$set(this.someObject,'b',2) (這也是全局 Vue.set 方法的別名)
三雾鬼、異步更新隊(duì)列。在最新的項(xiàng)目中遇到了這種情況宴树,數(shù)據(jù)第一次獲取到了呆贿,也渲染了,但是第二次之后數(shù)據(jù)只有在再一次渲染頁面的時候更新森渐,并不能實(shí)時更新做入。
網(wǎng)上查了資料才知道,Vue?異步執(zhí)行 DOM 更新同衣。只要觀察到數(shù)據(jù)變化竟块,Vue 將開啟一個隊(duì)列,并緩沖在同一事件循環(huán)中發(fā)生的所有數(shù)據(jù)改變耐齐。如果同一個 watcher 被多次觸發(fā)浪秘,只會被推入到隊(duì)列中一次。
解決辦法:可在數(shù)據(jù)變化之后立即使用?Vue.nextTick(callback)?埠况。這樣回調(diào)函數(shù)在 DOM 更新完成后就會調(diào)用耸携。例如:
因?yàn)?$nextTick()?返回一個 Promise 對象,所以可以使用新的?ES2016 async/await語法完成相同的事情:
四辕翰、vue多層循環(huán)夺衍,動態(tài)改變數(shù)據(jù)后渲染的很慢或者不渲染。
可在動態(tài)改變數(shù)據(jù)的方法喜命,第一行加上??
this.$forceUpdate();