导致原因:
由于 Vue 会在初始化实例时对 property 执行 getter/setter 转化,所以 property 必须在 data 对象上存在才能让 Vue 将它转换为响应式的
解决方法:
this.$forceUpdate()
用于强制组件重新渲染,即使没有响应式数据发生变化。通常情况下,Vue.js会自动跟踪数据的变化并进行重新渲染,但有时候您可能需要手动触发重新渲染,这时可以使用 方法。
2.this.$nextTick(() => { })
将回调延迟到下次 DOM 更新循环之后执行。
3.this.$set
this.$set(对象, '要修改参数名', 修改的内容)
例: this.obj = {
id:1
}
this.$set(this.obj, 'id', 2)
4.Object.defineProperty() 可以监测数组的变化
Object.defineProperty() 可以监测数组的变化。但对数组新增一个属性(index)不会监测到数据变化,因为无法监测到新增数组的下标(index),删除一个属性(index)也是。
var arr = [1, 2, 3, 4]
arr.forEach(function(item, index) {
Object.defineProperty(arr, index, {
set: function(value) {
console.log('触发 setter')
item = value
},
get: function() {
console.log('触发 getter')
return item
}
})
})
arr[1] = '123' // 触发 setter
arr[1] // 触发 getter 返回值为 "123"
arr[5] = 5 // 不会触发 setter 和 getter