面试题答案
一键面试- 直接依赖数据变化:
- 当计算属性的函数中直接引用的数据发生变化时,计算属性会重新计算。例如,在一个Vue组件中有如下计算属性:
这里data() { return { num1: 1, num2: 2 }; }, computed: { sum() { return this.num1 + this.num2; } }
sum
计算属性依赖num1
和num2
,当num1
或num2
的值改变时,sum
会重新计算。 - 对象属性变化:
- 如果计算属性依赖的是一个对象,当对象的属性值发生变化时,计算属性也会重新计算。
当修改data() { return { user: { name: 'John', age: 30 } }; }, computed: { userInfo() { return `Name: ${this.user.name}, Age: ${this.user.age}`; } }
this.user.name
或this.user.age
时,userInfo
计算属性会重新计算。不过需要注意,直接通过obj.newProp = 'new value'
添加新属性,计算属性不会响应变化,需要使用Vue.set
或this.$set
方法添加属性,计算属性才会重新计算。 - 数组元素变化:
- 当计算属性依赖的数组的元素发生变化时,计算属性会重新计算。
如果通过数组的变异方法(如data() { return { numbers: [1, 2, 3] }; }, computed: { sumOfNumbers() { return this.numbers.reduce((acc, num) => acc + num, 0); } }
push
、pop
、splice
等)改变数组内容,sumOfNumbers
会重新计算。但是如果直接通过索引赋值(如this.numbers[0] = 10
),计算属性不会响应变化,同样需要使用Vue.set
或this.$set
方法修改数组元素,计算属性才会重新计算。 - 深层嵌套数据变化:
- 对于多层嵌套的对象或数组,如果深层数据发生变化,计算属性也会重新计算,但前提是使用了Vue能追踪到变化的方式。例如对于嵌套对象:
要使data() { return { complexObj: { subObj: { value: 10 } } }; }, computed: { complexValue() { return this.complexObj.subObj.value * 2; } }
complexValue
重新计算,不能直接this.complexObj.subObj.value = 20
,而应该使用Vue.set(this.complexObj.subObj, 'value', 20)
或this.$set(this.complexObj.subObj, 'value', 20)
。对于嵌套数组同理。