什么是數(shù)據(jù)響應(yīng)式?優(yōu)點是?
“響應(yīng)式”,是指當數(shù)據(jù)改變后,Vue 會通知到使用該數(shù)據(jù)的代碼。例如,視圖渲染中使用了數(shù)據(jù),數(shù)據(jù)改變后,視圖也會自動更新。
數(shù)據(jù)(data)響應(yīng)式的基本代碼:
const vm = new Vue({data:{n:0}})
響應(yīng)式是vue的一大特色,不同于其他框架更新數(shù)據(jù)時繁雜操作,數(shù)據(jù)響應(yīng)式最大的優(yōu)點就是只要改了data就會自動更新ui。
數(shù)據(jù)響應(yīng)式的缺點
數(shù)據(jù)響應(yīng)式由于使用的是Object.defineProperty(vue2)這個api,它不能監(jiān)聽還不存在的屬性,所以如果你新增了一個屬性,vue是沒有辦法察覺到的。
看下面的這串代碼:
Object.defineProperty(obj,"n",{...})
在上面代碼當中必須要有一個 n,才能夠監(jiān)聽和代理obj.n。這是Object.defineProperty的bug.如果工作中忘記了給這個n,vue就會給出一個警告,例如:
new Vue({
? data: {},
? template: `<div>{{n}}</div>`
}).$mount("#app");
上面代碼當中,data是一個空的,然后再寫了一個n,Vue一旦發(fā)現(xiàn)是undefined或者是null它都一律不顯示在頁面上。
在這里控制臺會出現(xiàn)一個報錯:“屬性或者方法n 沒有定義在實例上面,但是你卻引用了它?!盫ue依然會正常的去執(zhí)行這些代碼,但是當它渲染到div的時候卻發(fā)現(xiàn)找不到n,所以不能再沒有定義n的情況下進行使用。
該怎么解決呢?
vue新提供了解決這個問題的api:Vue.set( target, propertyName/index, value )或者this.$set
參數(shù):
● {Object | Array} target? (要更改的數(shù)據(jù)源(可以是對象或者數(shù)組))
● {string | number} propertyName/index (要更改的具體數(shù)據(jù))
● {any} value(重新賦的值)
返回值:設(shè)置的值。
用法:
向響應(yīng)式對象中添加一個 property,并確保這個新 property 同樣是響應(yīng)式的,且觸發(fā)視圖更新。它必須用于向響應(yīng)式對象上添加新 property,因為 Vue 無法探測普通的新增 property (比如 this.myObject.newProperty = 'hi')
注意:對象不能是 Vue 實例,或者 Vue 實例的根數(shù)據(jù)對象。
還有一件事,忘記給屬性賦值可以用提高記性每次都賦好值來規(guī)避這個問題,但是如果想給數(shù)組新增它的key,value的值,因為你提前不知道數(shù)組到底有多少值,如果用Vue.set會很麻煩,所以Vue改造了push()方法,這種操作叫做變異方法。你可以直接采用push()來增加數(shù)組內(nèi)的東西。