面试题答案
一键面试利用插件机制优化性能
- 减少数据请求次数:
- 可以创建一个缓存插件。在插件中维护一个缓存对象,当发起数据请求时,先检查缓存中是否有对应数据。如果有,则直接使用缓存数据,不再发起新的请求。
- 提升状态更新效率:可以创建一个批量更新插件。在插件中收集状态更新操作,然后在合适的时机(比如事件循环的空闲期)批量执行这些更新,减少不必要的重新渲染。
插件的创建与使用过程
- 创建插件:
- 缓存插件示例:
// cachePlugin.js
export const cachePlugin = (options = {}) => {
const cache = {};
return {
install: (pinia, app) => {
pinia.hook('afterAction', (ctx) => {
if (ctx.store.$id === 'yourStoreId' && ctx.name === 'yourActionName') {
const { data } = ctx.payload;
cache[ctx.name] = data;
}
});
pinia.hook('beforeAction', (ctx) => {
if (ctx.store.$id === 'yourStoreId' && ctx.name === 'yourActionName') {
if (cache[ctx.name]) {
ctx.payload = { data: cache[ctx.name] };
ctx.options = { skipRequest: true };
}
}
});
}
};
};
- 批量更新插件示例:
// batchUpdatePlugin.js
export const batchUpdatePlugin = () => {
let updates = [];
let timer;
return {
install: (pinia, app) => {
pinia.hook('beforeAction', (ctx) => {
if (ctx.store.$id === 'yourStoreId' && ctx.name.startsWith('update')) {
updates.push(ctx);
if (!timer) {
timer = setTimeout(() => {
updates.forEach((update) => {
// 模拟执行更新操作
update.store[update.name](update.payload);
});
updates = [];
clearTimeout(timer);
timer = null;
}, 0);
}
ctx.options = { skipDirectUpdate: true };
}
});
}
};
};
- 使用插件:
- 在
main.js
中引入并使用插件:
- 在
import { createPinia } from 'pinia';
import { cachePlugin } from './cachePlugin.js';
import { batchUpdatePlugin } from './batchUpdatePlugin.js';
const pinia = createPinia();
pinia.use(cachePlugin());
pinia.use(batchUpdatePlugin());
const app = createApp(App);
app.use(pinia);
app.mount('#app');
在上述代码中,首先创建了两个插件 cachePlugin
和 batchUpdatePlugin
分别用于缓存数据和批量更新状态。然后在 main.js
中通过 pinia.use()
方法将插件应用到 Pinia 实例中,这样在相关的 Pinia 仓库操作时,插件中的逻辑就会生效。