vue3项目状态持久化方案Pinia

刷新后 username 消失是因为 Pinia 状态仅存于内存,页面刷新会重新初始化导致数据清空。 你的 Store 中虽然写了 localStorage.setItem 手动持久化,但初始化时并没有从 localStorage 读取恢复数据。

解决方案一:手动补全读取逻辑(无需安装插件)

直接修改 stores/user.ts,在初始化时从 localStorage 读取已保存的值:

javascript 复制代码
import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useUserStore = defineStore('user', () => {
  // ✅ 初始化时从 localStorage 读取,没有则默认空字符串
  const username = ref(localStorage.getItem('username') || '')

  function setUsername(name: string) {
    username.value = name
    localStorage.setItem('username', name)
  }

  function clearUser() {
    username.value = ''
    localStorage.removeItem('username')
  }

  return { username, setUsername, clearUser }
})

改动只有一行:ref('') 改为 ref(localStorage.getItem('username') || '')。这样页面刷新重新初始化 Store 时,会自动从 localStorage 恢复之前保存的用户名。

解决方案二:使用持久化插件(推荐,更省心)

如果后续有更多状态需要持久化,推荐使用 pinia-plugin-persistedstate 插件,自动处理存取,无需手动写 localStorage 逻辑:

1. 安装插件

复制代码
npm install pinia-plugin-persistedstate

2. 在 main.ts 中注册插件

javascript 复制代码
import { createApp } from "vue";
import { createPinia } from "pinia";
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import App from "./App.vue";
import router from "./router/index.ts";

const app = createApp(App);
const pinia = createPinia();

pinia.use(piniaPluginPersistedstate);  // ✅ 注册持久化插件

app.use(pinia);
app.use(router);
app.mount("#app");

3. 在 Store 中开启持久化

javascript 复制代码
import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useUserStore = defineStore('user', () => {
  const username = ref('')

  function setUsername(name: string) {
    username.value = name
  }

  function clearUser() {
    username.value = ''
  }

  return { username, setUsername, clearUser }
}, {
  persist: true  // ✅ 开启持久化,自动存入 localStorage
})

开启后,插件会自动在 username 变化时存入 localStorage,页面刷新时自动读取恢复,你不需要再手动写 localStorage.setItem 和 localStorage.getItem。

建议

当前只有 username 一个字段,用方案一 改一行代码最快;如果后续还有 token、权限等更多状态需要持久化,建议直接用方案二,一劳永逸。

相关推荐
小码哥_常3 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮5 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀6 小时前
Vue插槽
前端·javascript·vue.js
qq_448011167 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan7 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352907 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝8 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing039 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel9 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放9 小时前
Python基础语法练习题(73)
java·前端·python