在 Pinia 里虽然没有内置的中间件机制,但可以通过自定义插件来模拟中间件,从而实现日志记录功能。以下是详细步骤和示例代码:
1. 创建日志记录中间件插件
你可以创建一个 JavaScript 文件(例如 logMiddleware.js
)来定义这个插件。在这个插件中,我们会重写每个 action 方法,在其执行前后添加日志记录逻辑。
// logMiddleware.js
export const logMiddleware = (context) => {
const {
store } = context;
// 遍历 store 中的所有 action
Object.keys(store.$actions).forEach((actionName) => {
const originalAction = store.$actions[actionName];
// 重写 action 方法
store.$actions[actionName] = async (...args) => {
// 记录 action 开始执行的日志
console.log(`Action ${
actionName} 开始执行,参数:`, args);
console.log('执行前状态:', store.$state);
try {
// 执行原始的 action 方法
const result = await originalAction(...args);
// 记录 action 执行成功的日志
console.log(`Action ${
actionName} 执行成功,结果:`, result);
console.log('执行后状态:', store.$state);
return result;
} catch (error) {
// 记录 action 执行失败的日志
console.error(`Action ${
actionName} 执行失败,错误信息:`, error);
throw error;
}
};
});
};
2. 在 Pinia 实例中使用插件
在创建 Pinia 实例的文件(通常是 main.js
或 main.ts
)中引入并使用这个插件。
// main.js
import {
createPinia } from 'pinia';
import {
logMiddleware } from './logMiddleware';
const pinia = createPinia();
// 使用日志记录中间件插件
pinia.use(logMiddleware);
export default pinia;
3. 定义并使用 Pinia store
下面是一个简单的 Pinia store 示例,我们会在组件中调用其中的 action 来触发日志记录。
// counterStore.js
import {
defineStore } from 'pinia';
export const useCounterStore = defineStore('counter', {
state: () => ({
count: 0
}),
actions: {
increment() {
this.count++;
},
decrement() {
this.count--;
}
}
});
4. 在组件中使用 store
在 Vue 组件里引入并使用这个 store,当调用 action 时,日志记录中间件就会生效。
<template>
<div>
<p>Count: {
{ counterStore.count }}</p>
<button @click="counterStore.increment">增加</button>
<button @click="counterStore.decrement">减少</button>
</div>
</template>
<script setup>
import { useCounterStore } from './counterStore';
const counterStore = useCounterStore();
</script>
代码解释
- 日志记录中间件插件:
logMiddleware
插件会遍历 store 中的所有 action,并重写这些 action 方法。在 action 执行前,它会记录 action 的名称、传入的参数以及当前的状态;在 action 执行成功后,会记录执行结果和更新后的状态;如果 action 执行失败,则会记录错误信息。 - Pinia 实例:在创建 Pinia 实例时,通过
use
方法使用了日志记录中间件插件,这样所有使用该 Pinia 实例的 store 都会应用这个中间件。 - Pinia store:定义了一个简单的计数器 store,包含
increment
和decrement
两个 action。 - Vue 组件:引入并使用了这个计数器 store,当点击按钮调用 action 时,日志记录中间件就会输出相应的日志信息。
通过以上步骤,你就可以在 Pinia 中使用中间件进行日志记录了。