Vue 更新data選項中的數(shù)組


title: Vue 更新data選項中的數(shù)組
date: 2018-12-18 18:05:19
tags: [Vue]
categories: Vue


疑問

最近看到一道面試題,如下:

var vm = new Vue({
  data: {
    items: [1, 2, 3]
  }
})
vm.items[1] = 'x'
vm.items.length = 2

這樣寫有什么問題?那應該怎么寫?

我看到這道題時并不覺得有什么問題。在Vue中,一旦響應式數(shù)據(jù)發(fā)生改變,setter 不是會發(fā)通知給 watcher 嗎?

解答

后來我才知道,這樣子寫的話 Vue 不會更新該數(shù)組數(shù)據(jù)對應的視圖

請先閱讀完官方文檔的 深入響應式原理,再看下面:

  1. 數(shù)據(jù)確實更新了,但視圖沒有更新,那就說明 Vue 并沒有檢測到該數(shù)據(jù)更新了
  2. 其實是數(shù)組的問題,在 Vue 中它比較特殊。
  3. 我們知道,Vue 會在初始化實例時對屬性執(zhí)行 getter/setter 轉(zhuǎn)化過程,所以屬性必須在 data 對象上存在才能讓 Vue 轉(zhuǎn)換它,這樣才能讓數(shù)據(jù)是響應式的。
  4. 往深了說,其實 Vue 在我們的data對象上都會定義一個ob屬性指向新創(chuàng)建的Observer對象,以此對數(shù)據(jù)設置監(jiān)控器。但由于現(xiàn)代 JavaScript 的限制(底層原理不明),Object.Observe 支持的不好,Vue 無法對數(shù)組進行Observer對象創(chuàng)建,因此不能檢測到數(shù)組對象的變化。
  5. 不過 Vue 給我們提供了別的方法,具體見下面。

解決方法

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)

// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
vm.items.splice(newLength)
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 這方面的文章很多,但是我感覺很多寫的比較抽象,本文會通過舉例更詳細的解釋。(此文面向的Vue新手們,如果你是個大牛...
    Ivy_2016閱讀 15,575評論 8 63
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,641評論 1 32
  • vue理解淺談 一 理解vue的核心理念 使用vue會讓人感到身心愉悅,它同時具備angular和react的優(yōu)點...
    ndxs2008閱讀 24,394評論 2 18
  • 前言 observer部分完整的源碼注釋放在github上了,有興趣的可以去看看,如果發(fā)現(xiàn)有誤情不吝賜教!obse...
    Lxylona閱讀 1,186評論 0 10
  • VUE介紹 Vue的特點構(gòu)建用戶界面,只關注View層簡單易學,簡潔、輕量、快速漸進式框架 框架VS庫庫,是一封裝...
    多多醬_DuoDuo_閱讀 2,855評論 1 17

友情鏈接更多精彩內(nèi)容