1. 问题描述
pinia-plugin-persistedstate
持久化失败
在登录时,发现调用useLogin
中的onSubmit
方法,无法将userStore
中的state
信息保存到localStorage
中,最总发现是useLogin.ts
中调用useUserStore
的位置不对导致的
2. 正确示例代码
2.1. Pinia代码
import { createPinia } from "pinia";
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
export default pinia;
2.2.用户信息模块
import { defineStore } from "pinia";
import { login } from "@/api/auth/login/index";
import { type LoginParam } from "@/api/auth/types/ro";
import { type LoginVO } from "@/api/auth/types/vo/index";
import { type Empty, type R } from "@/common/types/common";
type UserStateType = {
id: number | undefined;
nickname: string | undefined;
avatar: string | undefined;
accessToken: string | undefined;
};
export const useUserStore = defineStore("user", {
persist: {
key: "user",
storage: localStorage
},
state(): UserStateType {
return {
id: undefined,
nickname: undefined,
avatar: undefined,
accessToken: undefined
};
},
getters: {},
actions: {
async login(param: LoginParam): Promise<LoginVO | Empty> {
const resp = await login(param);
const payload: R<LoginVO> = resp.data;
const { code, data } = payload;
if (code === 10000) {
// 登录成功
const { id, nickname, avatar, accessToken } = data!;
this.id = id;
this.nickname = nickname;
this.avatar = avatar;
this.accessToken = accessToken;
}
return Promise.resolve(data);
},
isAuthorized(): boolean {
return !!this.accessToken;
}
}
});
2.3.useLogin.ts
import { ref, reactive } from "vue";
import { useUserStore } from "@/stores/modules/user";
export default function () {
function onSubmit(data) {
const userStore = useUserStore();
// request
userStore.login(data);
}
return { onSubmit };
}
3. 错误代码示例
错误
import { ref, reactive } from "vue";
import { useUserStore } from "@/stores/modules/user";
// error: 在函数外调用了useUserStore()
const userStore = useUserStore();
export default function () {
function onSubmit(data) {
// request
userStore.login(data);
}
return { onSubmit };
}
``
> 正确
```typescript
import { ref, reactive } from "vue";
import { useUserStore } from "@/stores/modules/user";
export default function () {
function onSubmit(data) {
// 在函数内调用useUserStore()
const userStore = useUserStore();
// request
userStore.login(data);
}
return { onSubmit };
}