首页 > 其他分享 >记录下Pinia持久化不生效问题

记录下Pinia持久化不生效问题

时间:2024-12-11 14:23:24浏览次数:3  
标签:持久 生效 userStore next Pinia import router path store

问题描述:
系统登录成功需要将后台返回的token持久化保存到localStorge中,这里使用pinia-plugin-persistedstate,在登陆成功后登录信息一直没有持久化到localStorge中。

代码如下:
1.配置持久化

import type { App } from 'vue'
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const store = createPinia()
store.use(piniaPluginPersistedstate)

export const setupStore = (app: App<Element>) => {
  store.use(piniaPluginPersistedstate)
  app.use(store)
}

export { store }

2.配置userStore

import { defineStore } from 'pinia'
import { store } from "../index";

import router from "@/router/index";

interface UserState {
  tokenKey: string;
  token: string;
}

export const useUsersStore = defineStore("user", {
  state: (): UserState => ({
    tokenKey: "AccessToken",
    token: "",
  }),
  getters: {
    getTokenKey(): string {
      return this.tokenKey;
    },
    getToken(): string {
      return this.token;
    },
  },
  actions: {
    setTokenKey(tokenKey: string) {
      this.tokenKey = tokenKey;
    },
    setToken(token: string) {
      this.token = token;
    },
    reset() {
      this.setToken('');
      router.replace("/login");
    },
    logout() {
      this.reset();
    },
  },
  persist: true
});

export const useUserStoreWithOut = () => {
  return useUsersStore(store);
};

3.登录成功后持久化登录token

try {
      const loginResp = await loginApi(userlogin);
      if (loginResp && 200 === loginResp.code && loginResp.data) {
        userStore.setToken(loginResp.data.tokenValue);
        userStore.setTokenKey(loginResp.data.tokenName);
        let path = $route.query.redirect as string ?? "/";
        $router.push({ path })
      }
    } finally {
      loading.value = false;
    }

登录成功后查看控制台没发现持久化信息:

然而创建其他store持久化是没有任何问题,只有userStore没法持久化,最终定位到问题再vue router导航守卫,代码如下:

import router from "@/router";
import { useNProgress } from "@/hooks/useNProgress";
import { useUserStoreWithOut } from './store/module/user'

const { start, done } = useNProgress();
const userStore = useUserStoreWithOut();
// @ts-ignore
router.beforeEach((to, from, next) => {
    start();
    if (userStore.getToken) {
        if (to.path === '/login') {
            next({path: '/'});
        } else {
            // 是否有访问权限
        }
        next();
    } else {
        if (to.path === '/login') {
            next();
        } else {
            next({path: '/login', query: {'redirect': to.path}})
        }
    } 
});

router.afterEach((to) => {
  document.title = to?.meta?.title as string;  
  done();
})

这里userStore的创建应该放在beforeEach匿名方法中,代码如下:

import router from "@/router";
import { useNProgress } from "@/hooks/useNProgress";
import { useUserStoreWithOut } from './store/module/user'

const { start, done } = useNProgress();
// @ts-ignore
router.beforeEach((to, from, next) => {
    start();
    const userStore = useUserStoreWithOut();
    if (userStore.getToken) {
        if (to.path === '/login') {
            next({path: '/'});
        } else {
            // 是否有访问权限
        }
        next();
    } else {
        if (to.path === '/login') {
            next();
        } else {
            next({path: '/login', query: {'redirect': to.path}})
        }
    } 
});

router.afterEach((to) => {
  document.title = to?.meta?.title as string;  
  done();
})

最终持久化成功:

标签:持久,生效,userStore,next,Pinia,import,router,path,store
From: https://www.cnblogs.com/cnxf/p/18599389

相关文章

  • 贴砖(即铺设大瓷砖)是一项常见的建筑施工工作,涉及到墙面和地面的装饰。为了保证施工质量
    贴砖(即铺设瓷砖)是一项常见的建筑施工工作,涉及到墙面和地面的装饰。为了保证施工质量和持久性,必须遵守相应的施工规范。以下是贴砖施工的一些基本规范,涵盖了操作步骤、材料要求以及质量控制等方面。1. 施工准备工具准备:常用工具包括水平尺、橡皮锤、钢丝刷、铲刀、砖刀、电动搅......
  • @font-face 使用后不生效
    @font-face使用后不生效判断引用的字体包是否适配设备src:url(“…/font/sourceHanSans/SOURCEHANSANSSC-REGULAR.eot”);/*IE9/src:url(SOURCEHANSANSSC-REGULAR.eot")/IE6-IE8/url(“SOURCEHANSANSSC-REGULAR.woff2”)url(“SOURCEHANSANSSC-REGULAR.woff......
  • Vue3 状态管理问题(Vuex / Pinia)
    Vue3状态管理问题详解(Vuex/Pinia)引言随着前端应用复杂度的不断增加,状态管理成为开发者面临的一个关键挑战。Vue.js作为流行的前端框架,提供了多种状态管理解决方案,其中最为广泛使用的两种是Vuex和Pinia。在Vue3的发布后,Pinia逐渐崭露头角,成为Vuex的有力竞争者。......
  • 可持久化Trie
    可持久化Trie--区间异或最值问题应用:在\(O(logn)\)时间复杂度解决查询区间\([l,r]\)内与数\(x\)异或的最大值。插入操作:把\(n\)个整数插入\(01Trie\),生成\(n\)个版本的可持久化树。查询操作:利用前缀和与差分的思想,用两颗前缀\(Trie\)树相减得到该区间的\(Trie\)......
  • 面经自测——MySQL联合索引/事务的四大特性/持久性怎么做/说一下MySQL日志
    前言本文是作者专门用来自测Java后端相关面试题的,所有问题都是在牛客、知识星球或网上找到的最近最新的面试题,全文回答都是作者按自己的真实水平仿照真实环境的回答,所以答案不一定真实(但回答一定真诚......
  • 如果一个标签元素同时出现两个class属性,两个class都会生效吗?为什么?
    是的,如果一个标签元素同时出现两个class属性,两个class都会生效。之所以如此,是因为HTML允许一个元素拥有多个class,它们之间用空格分隔。浏览器会将这些class合并起来,应用所有对应的样式规则。具体来说:HTML规范允许:HTML规范明确允许一个元素的class属性包含多......
  • pinia 持久化存储库pinia-plugin-persist使用
    对于Vue3和Pinia,有一个名为pinia-plugin-persist的插件可以用来持久化Piniastore的状态到localStorage或sessionStorage。这个插件简化了状态持久化的过程,使得你不需要手动编写保存和加载状态的逻辑。以下是如何使用pinia-plugin-persist插件来持久化Piniastore......
  • 解题报告-论对“区间可持久化”的新理解
    解题报告-论对“区间可持久化”的新理解当我第一眼看到“可持久化\(\texttt{Trie}\)”的时候,我以为这不过是一个\(\texttt{Trie}\)+可持久化罢了。事实证明也是这样,在后面的代码实现中,我也是一遍打对了这个紫色板子。那么,一道模板题,有什么好说的?正是因为控住我的不是模板,这道......
  • 一文教你用vite创建vue3项目初始化并添加router、axios、Pinia保姆级教程
    文章目录一、什么是vite二、什么是vue3三、什么是router四、什么是axios五、什么是pinia六、详细教程1.查看nodejs版本2.使用vite最新版3.配置@指代src目录(可选)4.安装router5.引入axios6.引入pinia一、什么是viteVite是新一代的前端构建工具,在尤雨溪开发Vue3.0的......
  • vue3 + TS,使用pinia,实现长连接推送数据的全局更新
    项目中经常会遇到一个长连接推送多个页面数据的情况,针对这种情况,如果每个需要推送数据的页面都写一个长连接,肯定维护起来比较麻烦,那该如何解决呢?话不多说,直接上干活。下载pinia,在maint.ts中进行导入//下载npminstallpinia//main.tsimport{createApp}from"vu......