面试题答案
一键面试性能优化思路
- 路由懒加载
- 原理:在Vue Router中使用懒加载,将组件分割成多个chunk,只有在需要的时候才加载。
- 示例:
const router = new VueRouter({ routes: [ { path: '/product', name: 'Product', component: () => import('./components/Product.vue') } ] });
- 异步组件的缓存
- 原理:使用
keep - alive
组件缓存异步组件,避免重复创建和销毁。 - 示例:
<keep - alive> <component :is="currentAsyncComponent"></component> </keep - alive>
- 在组件切换频繁时,这样可以减少组件创建和销毁带来的性能开销。
- 原理:使用
- 优化数据获取
- 原理:避免不必要的数据请求。可以采用防抖、节流的方式处理数据交互。
- 示例(防抖):
import { debounce } from 'lodash'; export default { data() { return { searchText: '' }; }, methods: { searchProducts: debounce(function() { // 实际的数据请求逻辑 console.log('Searching products with', this.searchText); }, 300) } };
- 对于频繁触发的数据请求,防抖可以确保在一定时间间隔内只执行一次请求,减少服务器压力和不必要的性能损耗。
内存管理思路
- 解绑事件
- 原理:在组件销毁时,解绑所有添加的事件监听器,防止内存泄漏。
- 示例:
export default { mounted() { window.addEventListener('scroll', this.handleScroll); }, beforeDestroy() { window.removeEventListener('scroll', this.handleScroll); }, methods: { handleScroll() { // 处理滚动事件的逻辑 } } };
- 清除定时器
- 原理:如果组件中有使用定时器,在组件销毁时清除定时器。
- 示例:
export default { data() { return { timer: null }; }, mounted() { this.timer = setInterval(() => { // 定时器逻辑 }, 1000); }, beforeDestroy() { clearInterval(this.timer); } };
- 避免闭包导致的内存泄漏
- 原理:谨慎使用闭包,确保闭包中引用的变量在合适的时候被释放。
- 示例:避免在组件方法中创建一个引用组件实例的闭包,并且在组件销毁后该闭包仍然存活的情况。例如:
export default { data() { return { dataArray: [1, 2, 3] }; }, methods: { // 错误示例,闭包中引用了组件实例,可能导致内存泄漏 badFunction() { const self = this; return function() { console.log(self.dataArray); }; }, // 正确示例,在闭包中使用局部变量 goodFunction() { const localArray = this.dataArray; return function() { console.log(localArray); }; } } };