面试题答案
一键面试设计思路
- 组件懒加载:将非首屏必需组件延迟加载,减少初始渲染的工作量。
- 图片懒加载:仅在图片进入视口时加载,避免一次性加载大量图片。
- 路由懒加载:按需加载路由对应的组件,而不是在应用启动时全部加载。
- 异步数据按需加载:根据用户操作或页面滚动等时机,获取所需数据,避免一开始就请求大量数据。
技术选型
- 组件懒加载:在Vue中使用
import()
语法实现异步组件加载。例如:
const MyComponent = () => import('./MyComponent.vue');
然后在模板中使用:
<MyComponent v-if="shouldLoadComponent" />
- 图片懒加载:使用
IntersectionObserver
API或第三方库如vue - lazyload
。- 使用
IntersectionObserver
:
- 使用
const img = document.querySelector('img');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
img.src = img.dataset.src;
observer.unobserve(img);
}
});
});
observer.observe(img);
- 使用 `vue - lazyload`:安装并在Vue项目中引入,在模板中:
<img v - lazy="imageUrl" />
- 路由懒加载:在Vue Router配置中使用
import()
语法。例如:
const router = new VueRouter({
routes: [
{
path: '/home',
name: 'Home',
component: () => import('./views/Home.vue')
}
]
});
- 异步数据按需加载:在组件的生命周期钩子(如
mounted
或用户操作事件)中使用axios
等库发送数据请求。例如:
export default {
data() {
return {
dataList: []
};
},
mounted() {
this.fetchData();
},
methods: {
async fetchData() {
try {
const response = await axios.get('/api/data');
this.dataList = response.data;
} catch (error) {
console.error('Error fetching data:', error);
}
}
}
};
可能遇到的问题与解决方案
- 组件懒加载闪烁问题:
- 问题:组件在加载过程中可能会出现短暂闪烁。
- 解决方案:可以设置加载动画,在组件加载完成前显示加载指示器,例如使用
v - loading
指令结合一些动画效果。
- 图片懒加载兼容性问题:
- 问题:
IntersectionObserver
在某些旧浏览器中不支持。 - 解决方案:使用
polyfill
来提供兼容性,如intersection - observer - polyfill
。
- 问题:
- 路由懒加载首屏白屏问题:
- 问题:首屏路由组件加载时间长,导致白屏。
- 解决方案:可以对首屏路由组件进行预加载,使用
router.beforeEach
钩子在合适时机提前加载组件,或者对首屏组件进行优化,减少其体积。
- 异步数据加载错误处理:
- 问题:数据请求可能失败,影响用户体验。
- 解决方案:在请求时进行错误捕获,显示友好的错误提示给用户,并提供重试机制。例如在
fetchData
方法中的catch
块中处理错误。