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.setItemlocalStorage.getItem

建议

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

相关推荐
江米小枣tonylua18 分钟前
TypeScript 全面の拥抱 !Prisma 8 + Electron 升级实战
前端
闪耀之光M7833 分钟前
npm命令解析
前端
咸鱼老弟40 分钟前
AI Agent 的"自主性悖论"——为什么给它的自由度越大,越要配一套更硬的护栏
前端·人工智能
默_笙1 小时前
💫 闭包是个背包:拆解小米前端面试题里的三道"闭包陷阱"
前端·javascript·面试
天若有情6732 小时前
粒子星空背景单页HTML模板|炫酷动态星空特效网页(纯前端)
前端·html·css动画·网页特效·粒子星空·静态网页模版
工业涂料百问2 小时前
【趋势前沿】系列(三)工业涂料国产替代的三个台阶:航空、海工、电子的突破路径与认证壁垒
前端
前端snow2 小时前
ai agent --- agentic RAG
前端
gyratesky2 小时前
记录一种很新的大屏开发方式
前端·数据可视化
xy34533 小时前
Axure 9.0 中继器核心结构
前端·ui·html·axure·原型·产品设计