由于 JavaScript 的限制,Vue 不能检测以下数组的变动:
var vm = new Vue({ data: { items: ['a', 'b', 'c'] } }) vm.items[1] = 'x' // 不是响应性的 vm.items.length = 2 // 不是响应性的
当利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue
可以使用:
Vue.set(vm.items, indexOfItem, newValue);或者:vm.$set(vm.items, indexOfItem, newValue)
vm.items.splice(indexOfItem, 1, newValue)
当修改数组的长度时,例如:vm.items.length = newLength
可以使用:vm.items.splice(newLength)
由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:
因为Vue 会在初始化实例时对属性执行 getter/setter 转化,所以属性必须在 data 对象上存在才能让 Vue 将它转换为响应式的。
var vm = new Vue({ data: { a: 1 } }) // `vm.a` 现在是响应式的 vm.b = 2 // `vm.b` 不是响应式的
对于已经创建的实例,Vue 不允许动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性。
var vm = new Vue({ data: { userProfile: { name: 'Anika' } } }) Vue.set(vm.userProfile, 'age', 27)
或者:可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名:
vm.$set(vm.userProfile, 'age', 27)
如果为已有对象赋值多个新属性:
vm.userProfile = Object.assign({}, vm.userProfile, { age: 27, favoriteColor: 'Vue Green' })
也可能是因为写的代码比dom更新执行得快,可以使用this.$nextTick()将代码延迟到下次dom更新之后执行。
跟全局方法 Vue.nextTick() 一样,不同的是回调的 this 自动绑定到调用它的实例上。
this.value = '你好啊'; this.$nextTick(() => { console.log(this.$refs['hello'].innerText); });
修改数组中对象的值:
//data中list的值 list: [ { name:'Lee', age:20 } ] //响应式修改值 this.list[0].name = "Joh"; this.$set(this.list,0,this.list[0]);
原文链接:https://blog.csdn.net/wsln_123456/article/details/95218723