成都论坛

浅谈Vue.js中变化检测的2种常见问题避坑

[复制链接]

123

主题

123

帖子

365

积分

中级会员

Rank: 3Rank: 3

积分
365
分享到:
发表于 2018-3-14 10:12:37 | 显示全部楼层 |阅读模式
1.检测数组
由于javascript的限制,vue.js不能检测到下面数组的变化:

直接索引设置元素,如vm.item[0]={};

修改数据的长度,如vm.item.length。

为了解决问题1,Vuejs扩展了观察数组,为它添加一个$set()方法:

// 与 `example1.items[0] = ...` 相同,但是能触发视图更新
example1.items.$set(0, { childMsg: 'Change!'})

问题2,需要一个空数组替换items。

除了$set(),vuejs也为观察数组添加了$remove()方法,用于从目标数组中查找并删除元素,在内部调用了splice()。因此,不必:

var index = this.items.indexOf(item)
if (index !== -1) {
  this.items.splice(index, 1)
}
只需:

this.items.$remove(item);
2.检测对象
受ES5的显示,Vuejs不能检测到对象属性的添加或删除。因为Vuejs在初始化时候将属性转化为getter/setter,所以属性必须在data对象才能让Vuejs转换它,才能让它是响应的,例如:

var data = { a: 1 }
var vm = new Vue({
  data: data
})
// `vm.a` 和 `data.a` 现在是响应的

vm.b = 2
// `vm.b` 不是响应的

data.b = 2
// `data.b` 不是响应的
不过,有办法在实例创建之后添加属性并且让它是响应的。对于Vue实例,可以使用$set(key,value)实例方法:

vm.$set('b', 2)
// `vm.b` 和 `data.b` 现在是响应的
对于普通数据对象,可以使用全局方法Vue.set(object, key, value):

Vue.set(data, 'c', 3)
// `vm.c` 和 `data.c` 现在是响应的
有时你想向已有对象上添加一些属性,例如使用 Object.assign() 或 _.extend() 添加属性。但是,添加到对象上的新属性不会触发更新。这时可以创建一个新的对象,包含原对象的属性和新的属性:

// 不使用 `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })

源码时代官网:http://www.itsource.cn
地址:成都市高新区府城大道西段399号天府新谷1号楼6F / 028-86261949
微信公众号:itsource (欢迎关注)
官方微博:源码时代官方
快速回复 返回顶部 返回列表