国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Vue不能觀察到數組length的變化

2024-05-06 15:33:34
字體:
來源:轉載
供稿:網友

由于 JavaScript 的限制,Vue 不能檢測以下變動的數組: 當你利用索引直接設置一個項時,例如:vm.items[indexOfItem] = newValue 當你修改數組的長度時,例如:vm.items.length = newLength

因為vue的響應式是通過 Object.defineProperty 來實現的,但是數組的length屬性是不能添加getter和setter,所有無法通過觀察length來判斷。

為什么Vue不能觀察到數組length的變化

如下代碼,雖然看起來數組的length是10,但是for in的時候只能遍歷出0, 1, 2,導致了只有前三個索引被加上了getter 和setter

var a = [0, 1, 2]a.length = 10// 只是顯示的給length賦值,索引3-9的對應的value也會賦值undefined// 但是索引3-9的key都是沒有值的// 我們可以用for-in打印,只會打印0,1,2for (var key in a) { console.log(key) // 0,1,2}

那么vue提供了一些解決方法

使用內置的Vue.$set

讓數組顯式的進行某個索引的觀察 Vue.set(array, indexOfItem, newValue)

實際上是調用了

Object.defineProperty(array, indexOfItem, { enumerable: true, configurable: true, get() { }, set(newVal) { }})

這樣可以手動指定需要觀察的key,那么就可以達到預期的效果。

重寫了 push, pop, shift, unshift, splice, sort, reverse方法

Vue源碼

const arrayProto = Array.prototypeexport const arrayMethods = Object.create(arrayProto)/** * Intercept mutating methods and emit events */;[ 'push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) { // cache original method const original = arrayProto[method] def(arrayMethods, method, function mutator (...args) {  const result = original.apply(this, args)  const ob = this.__ob__  let inserted  switch (method) {   case 'push':   case 'unshift':    inserted = args    break   case 'splice':    inserted = args.slice(2)    break  }  if (inserted) ob.observeArray(inserted)  // notify change  ob.dep.notify()  return result })})

這些是在Array.__proto__上 進行了方法重寫或者添加

并且對添加屬性的方法如 push,unshift,splice 所添加進來的新屬性進行手動觀察,源碼為

if (inserted) ob.observeArray(inserted)

對以上方法進行了手動的進行消息觸發

ob.dep.notify()

結論

vue對數組的length直接改變無法直接進行觀察,提供了vue.$set 進行顯式觀察,并且重寫了 push, pop, shift, unshift, splice, sort, reverse方法來進行隱式觀察。

以上所述是小編給大家介紹的Vue不能觀察到數組length的變化,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對錯新站長站網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 霍州市| 镇原县| 西充县| 建阳市| 东方市| 宣城市| 屯留县| 张家口市| 鲁山县| 华安县| 长泰县| 礼泉县| 茂名市| 错那县| 金门县| 深泽县| 都匀市| 通江县| 鹤山市| 南宫市| 思南县| 孟津县| 旌德县| 彭州市| 盐源县| 临泽县| 长春市| 青田县| 克山县| 津市市| 成武县| 芒康县| 保康县| 宁乡县| 商河县| 房产| 太仓市| 明溪县| 上杭县| 乳山市| 贺兰县|