我正在尝试在我的Quasar应用程序(Vue 3 / TypeScript)中使用带有Pinia的Pinia Persisted State Plugin。
开箱即用,一切正常。
但是当使用Quasar Boot 文件时,持久化状态停止工作。刷新页面会清除所有新值。
我不知道为什么 Boot 文件打破了持久化状态插件,但我已经缩小了罪魁祸首到一行...
这是我如何使用Pinia与Quasar和添加插件:
一月一日
/* eslint-disable @typescript-eslint/no-unused-vars */
import { store } from 'quasar/wrappers';
import { createPinia, Pinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
declare module '@quasar/app' {
interface BootFileParams<TState> {
store: Pinia;
}
interface PreFetchOptions<TState> {
store: Pinia;
}
}
declare module '@vue/runtime-core' {
interface ComponentCustomProperties {
$store: import('pinia').Pinia;
}
}
export default store(function (_) {
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate); // Pinia Plugin added here
return pinia;
});
这是我的Pinia商店的样子:
一个月一个月
import { defineStore } from 'pinia';
export const useUserStore = defineStore('user', {
state: () => {
return {
user: {
firstName: 'Mary',
},
};
},
persist: true, // Note that we are using a persisted state here
actions: {
setFirstName(firstName: string) {
this.user.firstName = firstName;
console.log('Name set to Pinia store: ', this.user.firstName);
},
getFirstName() {
if (!this.user.firstName) {
console.log('No name found in store. Setting "John" to Pinia store.');
this.user.firstName = 'John';
return this.user.firstName;
} else {
console.log('Name fetched from Pinia store: ', this.user.firstName);
return this.user.firstName;
}
},
},
});
下面是一个用于获取和设置firstName的前端页面示例:
src/pages/index.vue
<template>
<div>{{ firstName }}</div>
<q-form @submit="handleFirstNameSubmit">
<p>Change First Name</p>
<q-input v-model="firstNameInput" filled outline />
<q-btn label="Submit Name to Pinia Store" type="submit" />
</q-form>
<q-btn @click="handleFirstNameFetch" label="Fetch Name from Pinia Store" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { useUserStore } from 'src/store/user';
const userStore = useUserStore();
const firstName = ref<string>();
const firstNameInput = ref<string>();
const handleFirstNameSubmit = () => {
if (firstNameInput.value) {
userStore.setFirstName(firstNameInput.value);
}
};
const handleFirstNameFetch = () => {
firstName.value = userStore.getFirstName();
};
</script>
到目前为止,一切都工作正常。
我可以将firstName设置为Pinia商店,刷新页面,新名称仍在Pinia中。
但是,当在 Boot 文件中使用const userStore = useUserStore(store)
时,如下面的示例所示,持久化状态将停止工作:
src/boot/auth.ts
import { boot } from 'quasar/wrappers';
import { useUserStore } from 'src/store/user';
export default boot(({ store }) => {
const userStore = useUserStore(store);
// Do some other authentication stuff, setting initial user store values etc, below here...
});
知道发生了什么事吗?怎么解决?
我认为这个插件比使用备用的LocalStorage持久化状态解决方案要干净得多,所以我很想让它与Quasar一起工作。
2条答案
按热度按时间klr1opcd1#
Quasar应用程序的常见用例是在示例化根Vue应用程序示例之前运行代码。
如果应用程序未示例化,则说明pinia插件尚未安装。请参阅:https://github.com/vuejs/pinia/discussions/723#discussioncomment-2110660
cpjpxq1n2#
大家经过大量的研究我找到了这个问题的答案,你必须通过index.ts/js来获取const如下:
这在类星体中对我很有效