面试题答案
一键面试计算属性和侦听器的选择
- 计算属性
- 适用场景:当一个数据的值依赖于其他响应式数据,并且这个值在模板中会被多次使用时,适合使用计算属性。例如,在电商应用中,商品总价依赖于商品单价和数量,且总价在多个地方展示,就可以使用计算属性。
- 原理:计算属性具有缓存机制,只有它依赖的响应式数据发生变化时,才会重新计算。如果依赖的数据没有变化,多次访问计算属性会直接返回缓存的值,从而提高性能。
- 侦听器
- 适用场景:当需要在数据变化时执行异步操作,或者需要在数据变化时执行复杂的业务逻辑,且不需要缓存结果时,适合使用侦听器。比如,在搜索框输入内容时,需要实时调用接口进行搜索,就可以使用侦听器。
- 原理:侦听器会在监听的数据发生变化时立即执行回调函数,它没有缓存机制,只要数据变化就会触发。
使用不当引发的性能问题
- 计算属性使用不当
- 问题:如果在计算属性中执行了大量复杂的非响应式数据的计算操作,由于计算属性依赖的响应式数据变化时就会重新计算,可能导致不必要的性能开销。例如,在计算属性中进行复杂的字符串拼接,且拼接的字符串并非响应式数据,这样每次依赖的响应式数据变化都会重新计算这个复杂的拼接,浪费性能。
- 侦听器使用不当
- 问题:如果在侦听器回调中执行了过多同步的、高开销的操作,可能会阻塞主线程,导致页面卡顿。例如,在侦听器回调中进行大量的DOM操作或者复杂的数学计算,会影响页面的流畅度。另外,如果侦听器没有正确设置
deep
选项,对于对象或数组的深层变化可能无法监听到,导致业务逻辑不完整。
- 问题:如果在侦听器回调中执行了过多同步的、高开销的操作,可能会阻塞主线程,导致页面卡顿。例如,在侦听器回调中进行大量的DOM操作或者复杂的数学计算,会影响页面的流畅度。另外,如果侦听器没有正确设置
优化方案
- 计算属性优化
- 避免不必要计算:确保计算属性只依赖真正需要的响应式数据,将不依赖响应式数据的计算操作提取到普通函数中,在计算属性中调用普通函数,这样当响应式数据不变时,普通函数不会重复执行。
- 缓存计算结果:如果计算属性的计算过程非常复杂且开销大,可以考虑手动缓存计算结果。例如,使用一个变量来存储计算结果,每次进入计算属性时先检查这个变量是否有值,如果有则直接返回,只有当依赖的响应式数据变化时才重新计算并更新缓存变量。
- 侦听器优化
- 异步操作:对于在侦听器中执行的高开销操作,尽量使用异步操作,比如使用
setTimeout
或Promise
等方式,将操作放入任务队列,避免阻塞主线程。 - 正确设置
deep
选项:如果需要监听对象或数组的深层变化,要正确设置deep
为true
。但要注意,deep
为true
时会增加性能开销,所以只在必要时使用。同时,可以通过在回调中判断数据变化的具体情况,避免不必要的操作。例如,只对特定属性的变化执行特定逻辑,而不是对整个对象或数组的变化都执行相同的复杂逻辑。
- 异步操作:对于在侦听器中执行的高开销操作,尽量使用异步操作,比如使用