本篇内容主要讲解“vue3 pinia踩坑及解决实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3 pinia踩坑及解决实例代码分析”吧!安装yarn&nbs
本篇内容主要讲解“vue3 pinia踩坑及解决实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3 pinia踩坑及解决实例代码分析”吧!
yarn add pinia # or npm install pinia
// user.tsimport { defineStore } from 'pinia'export const useUserStore = defineStore({ id: 'user', state: () => ({ ... }), actions: { ... }})// components.vueimport { useUserStore } from '@/store/user'const userStore = useUserStore()
通常我们会在路由钩子中判断用户是否登陆,从而进行权限判断。如:
// permission.tsimport { NavigationGuardNext, RouteLocationNORMalized } from 'vue-router'import router from './router'import { useUserStore } from './store/user'const userStore: any = useUserStore()router.beforeEach(async(to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => { // TODO 判断是否登录 if (userStore.name) { ... }})// main.tsconst app = createApp(App)app.use(createPinia())import router from './router'import '@/permission'app.use(router)app.mount('#app')
代码从上往下执行过程中,遇到const userStore: any = useUserStore()
,会进行用户状态模块的获取,但是应用还没有挂载,所以Pinia的全局状态还没有进行初始化。造成了初始化用户模块状态获取时,全局状态并没有初始化,所以造成了当前问题。
在路由钩子函数进行用户状态模块的获取,调用路由钩子的时候,意味着全局状态已完全初始化完成。但会造成每次调用路由钩子都获取用户状态模块,会造成资源的浪费(当然可以达到预期目的,但并不是我们需要的)。我们可以在外层声明一个变量用来存储状态,在路由钩子中进行判断,如果当前变量为空,也就意味着状态还没有进行过获取,在当前情况下进行状态获取(类似于单例)。最终代码:
// permission.tsimport { NavigationGuardNext, RouteLocationNormalized } from 'vue-router'import router from './router'import { useUserStore } from './store/user'let userStore: any = nullrouter.beforeEach(async(to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => { if (userStore === null) { userStore = useUserStore() } // TODO 判断是否登录 if (userStore.name) { ... }})
到此,相信大家对“vue3 pinia踩坑及解决实例代码分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
--结束END--
本文标题: vue3 pinia踩坑及解决实例代码分析
本文链接: https://lsjlt.com/news/350840.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0