Vue中监听数组和对象变化时,新旧值相同的问题

4,489 阅读1分钟

在Vue的官方文档中有以下解释:

官方文档

观察 Vue 实例变化的一个表达式或计算属性函数。回调函数得到的参数为新值和旧值。表达式只接受监督的键路径。对于更复杂的表达式,用一个函数取代。

注意:在变异 (不是替换) 对象或数组时,旧值将与新值相同,因为它们的引用指向同一个对象/数组。Vue 不会保留变异之前值的副本。

也就是说,在对数组使用方法进行操作或者对对象进行遍历的变异操作时,是无法记录旧值的。 于是简单得总结了一下,可以使用以下方法解决:

data () {
	return {
		selectedTag: Object || Array
	}
},
methods: {
	...
	//对象或者数组的变异操作
},
// 如果是对象,
computed: {
    selectedTagNew () {
      return JSON.parse(JSON.stringify(this.selectedTag))
    }
},
如果为数组,可以改为
computed: {
    selectedTagNew () {
      return [...new Set(selectedTag)]
    }
},
// 然后改为改为监听selectedTagNew,就能监听到新旧值的不同
watch: {
	selectedTagNew: {
		handler(val, oldval){
			...
		}
	}
}