面试题答案
一键面试优化性能策略
- 代码分割:在Vue应用中使用动态导入(
import()
)来实现代码分割,这样可以按需加载组件,减少初始加载的代码量。例如,对于依赖异步数据的表单组件,可以在需要时才加载。const asyncFormComponent = () => import('./AsyncFormComponent.vue');
- 防抖与节流:对于表单元素的输入事件,如搜索框,使用防抖(
debounce
)或节流(throttle
)技术来控制API请求频率,避免短时间内多次触发请求。import { debounce } from 'lodash'; export default { data() { return { searchValue: '' }; }, methods: { async search() { // 实际的API请求逻辑 }, debouncedSearch: debounce(function() { this.search(); }, 300) } };
缓存处理
- 使用Vuex缓存:利用Vuex来存储异步加载的数据,并设置缓存有效期。例如,创建一个模块来管理异步数据缓存。
// store/modules/cache.js const state = { asyncData1: null, cacheExpiry1: null, asyncData2: null, cacheExpiry2: null }; const mutations = { SET_ASYNC_DATA(state, { key, data }) { state[`asyncData${key}`] = data; state[`cacheExpiry${key}`] = new Date().getTime() + 60 * 1000; // 缓存1分钟 } }; const actions = { async fetchAsyncData({ commit, state }, key) { if (state[`asyncData${key}`] && new Date().getTime() < state[`cacheExpiry${key}`]) { return state[`asyncData${key}`]; } const response = await fetch(`/api/asyncData${key}`); const data = await response.json(); commit('SET_ASYNC_DATA', { key, data }); return data; } }; export default { namespaced: true, state, mutations, actions };
- 浏览器本地存储:对于不敏感且变化不频繁的数据,可以使用
localStorage
进行缓存。但要注意数据大小限制和安全性。const loadFromLocalStorage = (key) => { const data = localStorage.getItem(key); return data? JSON.parse(data) : null; }; const saveToLocalStorage = (key, data) => { localStorage.setItem(key, JSON.stringify(data)); };
应对网络问题
- 加载状态管理:在组件中使用
loading
状态来显示加载动画,告知用户数据正在加载。<template> <div> <loading-spinner v-if="loading"></loading-spinner> <form v-else> <!-- 表单内容 --> </form> </div> </template> <script> export default { data() { return { loading: false }; }, methods: { async loadData() { this.loading = true; try { await this.$store.dispatch('cache/fetchAsyncData', 1); } catch (error) { // 处理网络错误 } finally { this.loading = false; } } }, created() { this.loadData(); } }; </script>
- 错误处理与重试:在API请求失败时,给予用户提示,并提供重试功能。可以使用
axios
的拦截器来统一处理错误。import axios from 'axios'; axios.interceptors.response.use( response => response, error => { if (error.response.status === 408 || error.response.status === 500 || error.code === 'ECONNABORTED') { // 网络超时或服务器错误 alert('网络不稳定,请稍后重试'); return new Promise((resolve, reject) => { setTimeout(() => { axios(error.config).then(resolve).catch(reject); }, 3000); // 3秒后重试 }); } return Promise.reject(error); } );
关键代码设计与实现总结
- 组件层面:利用
loading
状态管理加载动画,通过watch
监听数据变化,使用防抖节流优化用户操作触发的请求。 - Vuex层面:构建缓存模块,通过
actions
控制数据的获取与缓存更新,利用mutations
修改缓存状态。 - 全局层面:借助
axios
拦截器处理网络错误与重试逻辑,确保在网络不稳定时应用的健壮性。