vue.js 为什么在Quasar Boot 文件中调用“useUserStore(store)”会破坏Pinia持久状态插件?

nnsrf1az  于 2022-11-17  发布在  Vue.js
关注(0)|答案(2)|浏览(240)

我正在尝试在我的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一起工作。

klr1opcd

klr1opcd1#

Quasar应用程序的常见用例是在示例化根Vue应用程序示例之前运行代码。
如果应用程序未示例化,则说明pinia插件尚未安装。请参阅:https://github.com/vuejs/pinia/discussions/723#discussioncomment-2110660

cpjpxq1n

cpjpxq1n2#

大家经过大量的研究我找到了这个问题的答案,你必须通过index.ts/js来获取const如下:
这在类星体中对我很有效

<script lang="ts" setup>
import store from '../stores/index';
import { useCounterStore } from '../stores/counter';

const counterStore = useCounterStore(store());
counterStore.increment();
console.log(counterStore.count);
</script>

相关问题