router 中使用 pinia 的仓库,仓库属性不更新 bug

简介

今天做项目在 router 中使用 pinia 的仓库时遇到了一些问题,记录一下。

我的操作是,在 router 中的前置路由守卫中使用 pinia 的用户信息仓库,修改其中的属性。

问题

操作页面后,页面不更新,仓库中的属性不更新。

我最初想法是在前置路由守卫之外获取 pinia 仓库实例。之后再路由守卫中修改其中的属性。触发页面内容的改变。

但这先出现了报错:"getActivePinia()" was called but there was no active Pinia. Are you trying to use a store before calling "app.use(pinia)"?

然后我在获取 pinia 仓库实例时传入了 createPinia() 函数:const userStore = useUserStore(createPinia())

这样就可以获取到 pinia 仓库实例了,并解决了报错。

注意:在 main.ts 中需要保证 pinia 的加载在 路由 的加载之前。app.use(createPinia()).use(router)

然后出现了现在的错误,仓库的内容不会更新。

最终发现的是在前置路由守卫之外定义的内容,不是响应式的,获取不到最新的内容。

原因

前置路由守卫之外定义的内容,不是响应式的,获取不到最新的内容。

需要在路由守卫中定义,当每次路由跳转时会获取到最新的内容。

解决

在前置路由守卫中使用 useStore() 函数获取 pinia 仓库实例:const userStore = useUserStore()