一、问题
在开发过程中,经常遇到这样的情况:当data里边已经声明或赋值过对象或者数组(数组里边的值是对象)时,再向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。
根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。
- 当你把一个普通的js对象传入Vue实例作为data选项,vue将遍历此对象所有的属性,并使用Object.defineProperty把这些属性全部转为getter/setter。
受现代js的限制,vue不能检测到对象属性的添加或删除。由于Vue会在初始化实例时对属性执行getter/setter转化过程,所以属性必须在data对象上存在才能让vue转换它,这样才能让它是响应的。
举个例子:
data () {
return {
student: {
name: '',
age: ''
}
}
},
mounted () {
this.student.age = 24
}
众所周知,直接给student赋值操作,虽然可以新增属性,但是不会触发视图( 页面 )
更新原因是:vue.js的属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。
二、解决方法
vue.$set(obj,key,value)
举例:
mounted () {
this.$set(this.student,"age", 24)
}
第一个参数:改变的对象
第二个参数:改变的对象中的属性
第三个参数:改变的属性值