面试题答案
一键面试缓存数据
- 浏览器本地缓存:
- 使用场景:对于不经常变化的数据,如网站的配置信息、某些基础字典数据等。
- 实施方法:在网络请求成功后,使用
localStorage
或sessionStorage
将数据存储起来。下次请求相同数据时,先检查缓存中是否存在。例如:
const getData = async () => { const cachedData = localStorage.getItem('myData'); if (cachedData) { return JSON.parse(cachedData); } const response = await fetch('/api/data'); const data = await response.json(); localStorage.setItem('myData', JSON.stringify(data)); return data; };
- 内存缓存:
- 使用场景:在Vue组件内或Vuex模块内缓存数据,适用于同一页面或组件内多次请求相同数据的场景。
- 实施方法:在Vuex模块中定义一个变量来存储缓存数据。例如:
const state = { cachedUserData: null }; const actions = { async getUserData({ state, commit }) { if (state.cachedUserData) { return state.cachedUserData; } const response = await fetch('/api/userData'); const data = await response.json(); commit('SET_USER_DATA', data); return data; } }; const mutations = { SET_USER_DATA(state, data) { state.cachedUserData = data; } };
避免不必要的请求
- 防抖与节流:
- 使用场景:当用户频繁触发某些操作导致频繁网络请求时,如搜索框输入触发搜索请求。
- 实施方法:
- 防抖:使用
lodash
库的debounce
函数。例如在Vue组件中:
<template> <input v-model="searchText" @input="debouncedSearch"> </template> <script> import { debounce } from 'lodash'; export default { data() { return { searchText: '' }; }, methods: { async search() { const response = await fetch(`/api/search?q=${this.searchText}`); const data = await response.json(); // 处理数据 }, debouncedSearch: debounce(function () { this.search(); }, 300); } }; </script>
- 节流:同样可以使用
lodash
的throttle
函数。例如在滚动加载更多数据的场景中:
<template> <div @scroll="throttledLoadMore"> <!-- 页面内容 --> </div> </template> <script> import { throttle } from 'lodash'; export default { methods: { async loadMore() { // 网络请求加载更多数据 }, throttledLoadMore: throttle(function () { this.loadMore(); }, 500); } }; </script>
- 防抖:使用
- 依赖分析:
- 使用场景:在Vuex中,当多个模块依赖同一个网络请求的数据时。
- 实施方法:通过分析模块间的依赖关系,确保只在必要时触发请求。例如,模块A和模块B都需要用户信息,在模块A获取用户信息后,模块B可以直接从Vuex的状态中获取,而不是再次请求。可以通过Vuex的
getters
来实现共享数据的访问。
const moduleA = { state: { user: null }, actions: { async fetchUser({ commit }) { const response = await fetch('/api/user'); const user = await response.json(); commit('SET_USER', user); } }, mutations: { SET_USER(state, user) { state.user = user; } } }; const moduleB = { getters: { getUser(state, getters, rootState) { return rootState.moduleA.user; } } };
优化Vuex的状态更新机制
- 批量更新:
- 使用场景:当需要多次更新Vuex状态时。
- 实施方法:在Vuex的
mutations
中尽量合并相关的状态更新操作。例如,原本有两个独立的mutations
更新用户信息的不同部分:
可以合并为一个:const mutations = { UPDATE_USER_NAME(state, name) { state.user.name = name; }, UPDATE_USER_AGE(state, age) { state.user.age = age; } };
const mutations = { UPDATE_USER(state, { name, age }) { state.user.name = name; state.user.age = age; } };
- 减少不必要的状态更新:
- 使用场景:当某些状态变化对业务逻辑没有实质影响时。
- 实施方法:在
mutations
中添加逻辑判断,只有当新值与旧值不同时才更新状态。例如:
const mutations = { UPDATE_USER_NAME(state, name) { if (state.user.name!== name) { state.user.name = name; } } };
在实际项目中,我曾参与一个电商项目,商品列表数据展示时,对于商品分类数据采用了浏览器本地缓存,因为分类数据不经常变化。在搜索商品时,使用了防抖技术来避免用户频繁输入导致过多请求。在Vuex管理商品详情数据时,采用了内存缓存,同一页面内多次查看商品详情不再重复请求。并且通过合理设计Vuex的mutations
,对商品信息的更新进行了批量处理和不必要更新的判断,有效提升了性能。