1、為什么要用set?
在vue中,并不是任何時候數據都是雙向綁定的。
在官方文檔中,有這樣一段話,如下:
從文檔得知,當數據沒有被雙向綁定的時候,我們就需要使用set了
2、set用法
解決數據沒有被雙向綁定我們可以使用 vm.$set 實例方法,該方法是全局方法 Vue.set 的一個別名。
- this.$set(原數組, 索引值, 需要賦的值)
length的問題還需要用splice方法。
- vm.items.splice(newLength)
3、什么時候使用set?
set為解決雙向綁定失效而生,我們只需要關注什么時候雙向綁定失效就可以了。
筆者看完了官方文檔以后,總結了一下,只要值的地址沒有改變,vue是檢測不到數據變化的。
共有下面三種情況:
1.當你利用索引直接設置一個數組項時,例如:vm.items[indexOfItem] = newValue
2.當你修改數組的長度時,例如:vm.items.length = newLength
3.由于 JavaScript 的限制,Vue不能檢測對象屬性的添加或刪除
此處針對第三點做一些說明:
var vm = new Vue({
data: {
a: 1
}
})
// `vm.a` 現在是響應式的
vm.b = 2
// `vm.b` 不是響應式的
從上面的代碼我們可以知道vm.b不是響應式的,簡單的來說,如果對象中原來沒有這個key,新增的key是無法雙向綁定的。
當然這里我們同樣可以用set去解決這個問題:
vm.$set(vm.userProfile, 'age', 27)
如果我們添加的屬性很多條,可能就需要寫一個循環(huán)來多次set。當然你也可能使用Object.assign,這里有一些需要注意的地方。
如果你想添加新的響應式屬性,下面這樣寫是不行的。
Object.assign(vm.userProfile, {
age: 27,
favoriteColor: 'Vue Green'
})
下面這樣才是正確的。
vm.userProfile = Object.assign({}, vm.userProfile, {
age: 27,
favoriteColor: 'Vue Green'
})