json 如何在Nuxt插件中等待/访问嵌套的代理值?

yc0p9oo0  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(132)

我有一个PostHog的插件。在这个插件中,我想初始化我的Pinia存储,所以我可以使用存储数据。我的问题是插件在我的商店加载之前加载,所以我收到了一个嵌套对象的代理。
我如何从这个代理中提取我需要的数据,以便我可以在我的插件中使用它?或者,我如何确保在插件初始化之前,我的存储中已经充满了数据?
我尝试了JSON.stringifyJSON.parse...userStore.activeUser的所有可能组合,但总是得到空结果。
这是我的JSON对象,当我字符串化它。

{
   "$id":"user",
   "activeUser":null
}

我正在尝试访问activeUser.actieveBasisgroepactiveUser应该填写下面的代码。

{
   "user":"123",
   "actieveBasisgroep":{
      "id":"dde240a0-e5bb-459a-abde-6ca708861d87"
   }
}

插件看起来像这样:

export default defineNuxtPlugin(async (nuxtApp) => {
  const userStore = useUserStore();
  console.log(JSON.stringify({ ...userStore }));
  console.log(toRaw({ ...userStore.activeUser }));

  if (toRaw({ ...userStore.activeUser }).actieveBasisgroep) {
    console.log('nope');
  }

  return '';
});

我的商店是这样的:

export const useUserStore = defineStore('user', {
  state: () => {
    return {
      activeUser: null as null | ActiveUser,
    };
  },
  // Setters, getters, actions ...
7vux5j2d

7vux5j2d1#

这是因为Pinia在Vue中没有被激活,因为Vue本身还没有准备好,它来自使用Pinia(app.use(pinia))的Vue示例,您的商店会自动查找Pinia的顶级示例,在这种情况下,您必须手动让商店知道要使用哪个Pinia示例。
要在Vue完全初始化之前使用Pinia,或者例如在路由器导航守卫(Vue示例范围之外的任何东西)中使用Pinia,您需要将顶级共享示例传递给store,与您给Vue的示例相同。
你可以通过将Pinia示例分配到一个全局作用域(如window.Pinia = createPinia()useUserStore(window.Pinia))来实现这一点,或者使用一些基于总线的实践,我更喜欢使用简单的JS原生模块方法:

// src/pinia.ts

const pinia = createPinia()

export default pinia
// main.ts
import pinia from '@/pinia'

...
app.use(pinia) // Ensure your app uses the shared instance you created.
...
// src/plugins/myPlugin
import pinia from '@/pinia'

export default defineNuxtPlugin(async (nuxtApp) => {
  const userStore = useUserStore(pinia); // Give store shared pinia instance

  console.log(JSON.stringify({ ...userStore }));
  console.log(toRaw({ ...userStore.activeUser }));

  if (toRaw({ ...userStore.activeUser }).actieveBasisgroep) {
    console.log('nope');
  }

  return '';
});

相关问题