详解Vue的Pinia如何做到刷新不丢数据

 更新时间:2025年01月16日 11:04:15   作者:百锦再@新空间代码工作室  
Pinia 是 Vue 3 的官方推荐状态管理库,旨在替代 Vuex,提供更简单、直观的状态管理解决方案,Pinia 的设计理念是简单、易于学习和使用,本文给大家详细介绍了Vue的Pinia如何做到刷新不丢数据,需要的朋友可以参考下

1. Pinia 简介

Pinia 是 Vue 3 的官方推荐状态管理库,旨在替代 Vuex,提供更简单、直观的状态管理解决方案。Pinia 的设计理念是简单、易于学习和使用,支持组合式 API 和选项式 API。它允许跨组件或页面共享状态,避免了 Vuex 中的许多复杂概念。

2. 安装 Pinia

安装 Pinia 非常简单,可以通过 npm 或 yarn 完成:
bash复制

npm install pinia --save

或者

yarn add pinia

3. 创建 Pinia Store

在 Pinia 中,状态管理的核心是 Store。Store 可以理解为一个包含状态、getters 和 actions 的对象。以下是一个创建 Store 的基本示例:
JavaScript复制

// stores/user.js
import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
  state: () => ({
    isLoggedIn: false,
    user: null
  }),
  actions: {
    login(user) {
      this.isLoggedIn = true;
      this.user = user;
    },
    logout() {
      this.isLoggedIn = false;
      this.user = null;
    }
  },
  getters: {
    isUserLoggedIn: (state) => state.isLoggedIn,
    currentUser: (state) => state.user
  }
});

4. 注册 Pinia

在主应用文件中注册 Pinia 和 Store:

5. 在组件中使用 Pinia Store

在 Vue 组件中,可以通过 useUserStore 来访问 Pinia 的 store:
vue复制

<template>
  <div>
    <p v-if="userStore.isLoggedIn">Welcome, {{ userStore.user.name }}!</p>
    <button @click="login">Login</button>
    <button @click="logout">Logout</button>
  </div>
</template>

<script setup>
import { useUserStore } from '@/stores/user';
const userStore = useUserStore();

function login() {
  userStore.login({ name: 'John Doe' });
}

function logout() {
  userStore.logout();
}

 6. 刷新页面后数据保持的解决方案

在 Web 应用中,通常需要处理页面刷新后数据丢失的问题。为了在刷新页面后保持 Pinia 状态,可以使用 localStorage 或 sessionStorage 来持久化存储状态。Pinia 提供了一个插件 pinia-plugin-persistedstate,可以自动将状态保存到 localStorage 或 sessionStorage 中,防止刷新页面后数据丢失。

6.1 安装插件

npm install pinia-plugin-persistedstate

6.2 配置插件

在 src/main.js 中引入并注册该插件:
JavaScript复制

// src/main.js
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import piniaPersist from 'pinia-plugin-persistedstate';
import App from './App.vue';

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

pinia.use(piniaPersist);
app.use(pinia);
app.mount('#app');

6.3 配置 Pinia Store 持久化

在你的 store 中,可以配置 persist 选项来指定哪些状态需要持久化存储:

// src/stores/user.js
import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
  state: () => ({
    isLoggedIn: false,
    user: null
  }),
  actions: {
    login(user) {
      this.isLoggedIn = true;
      this.user = user;
    },
    logout() {
      this.isLoggedIn = false;
      this.user = null;
    }
  },
  persist: {
    enabled: true, // 启用持久化
    strategies: [
      {
        storage: localStorage, // 使用 localStorage 存储
        paths: ['isLoggedIn', 'user'] // 持久化这两个字段
      }
    ]
  }
});

7. 手动持久化(可选)

如果你不想使用插件,也可以手动实现页面刷新的数据保持。下面是一个简单的例子,展示了如何将状态保存到 localStorage,并在页面加载时从 localStorage 恢复状态:
JavaScript复制

// src/stores/user.js

import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
  state: () => ({
    isLoggedIn: localStorage.getItem('isLoggedIn') === 'true', // 从 localStorage 获取值并转换
    user: JSON.parse(localStorage.getItem('user') || 'null') // 从 localStorage 获取值
  }),
  actions: {
    login(user) {
      this.isLoggedIn = true;
      this.user = user;
      localStorage.setItem('isLoggedIn', 'true'); // 存储到 localStorage
      localStorage.setItem('user', JSON.stringify(user)); // 存储到 localStorage
    },
    logout() {
      this.isLoggedIn = false;
      this.user = null;
      localStorage.removeItem('isLoggedIn'); // 删除 localStorage 中的数据
      localStorage.removeItem('user'); // 删除 localStorage 中的数据
    }
  }
});

这样,通过手动管理 localStorage,你也可以实现数据在页面刷新后保持。

8. 持久化保存的原理

持久化保存的原理是在 Pinia 中数据更新时,同步保存到 localStorage 或 sessionStorage 中,刷新后从本地存储中读取数据。你可以选择自己去写,但实现起来并不像想象中那么容易,当然,也没那么难。推荐使用插件去实现持久化存储,这样更便捷,省时省力。

8.1 使用插件

使用 pinia-plugin-persistedstate 插件可以自动将状态保存到 localStorage 或 sessionStorage 中,刷新后自动读取。插件的配置非常灵活,可以指定哪些状态需要持久化,以及使用哪种存储方式。

8.2 手动实现

手动实现持久化存储需要在每个状态更新时手动调用 localStorage 或 sessionStorage 的 setItem 方法,在页面加载时调用 getItem 方法恢复状态。这种方法虽然灵活,但代码量较大,容易出错。

9. 代码示例

以下是一个完整的示例,展示了如何使用 pinia-plugin-persistedstate 插件实现 Pinia 状态的持久化。

9.1 安装插件

npm install pinia-plugin-persistedstate

9.2 配置插件

在 src/main.js 中引入并注册该插件:
JavaScript复制

// src/main.js
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import piniaPersist from 'pinia-plugin-persistedstate';
import App from './App.vue';

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

pinia.use(piniaPersist);
app.use(pinia);
app.mount('#app');

9.3 创建 Store

创建一个包含用户状态的 Store,并启用持久化:

// src/stores/user.js
import { defineStore } from ‘pinia';

export const useUserStore = defineStore(‘user', {
state: () => ({
isLoggedIn: false,
user: null
}),
actions: {
login(user) {
this.isLoggedIn = true;
this.user = user;
},
logout() {
this.isLoggedIn = false;
this.user = null;
}
},
persist: {
enabled: true, // 启用持久化
strategies: [
{
storage: localStorage, // 使用 localStorage 存储
paths: [‘isLoggedIn', ‘user'] // 持久化这两个字段
}
]
}
});

9.4 在组件中使用 Store

在 Vue 组件中使用 Store,并调用 login 和 logout 方法:

Welcome, {{ userStore.user.name }}!

10. 总结

通过使用 pinia-plugin-persistedstate 插件,可以轻松实现 Pinia 状态的持久化存储,防止页面刷新后数据丢失。手动实现持久化存储虽然灵活,但代码量较大,容易出错。在实际开发中,推荐使用插件来简化开发过程,提高开发效率。

11. 注意事项

存储限制:localStorage 和 sessionStorage 的存储容量有限,通常为 5MB 左右。如果存储的数据量过大,可能会导致存储失败。
安全性:存储在 localStorage 和 sessionStorage 中的数据是明文存储的,容易被恶意用户篡改。如果存储的数据包含敏感信息,需要进行加密处理。
兼容性:localStorage 和 sessionStorage 在所有现代浏览器中都得到了支持,但在一些旧版本的浏览器中可能不支持。如果需要支持旧版本浏览器,需要进行兼容性处理。

以上就是详解Vue的Pinia如何做到刷新不丢数据的详细内容,更多关于Vue Pinia刷新不丢数据的资料请关注脚本之家其它相关文章!

相关文章

  • vue+iview使用树形控件的具体使用

    vue+iview使用树形控件的具体使用

    这篇文章主要介绍了vue+iview使用树形控件的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • vue3如何避免样式污染的方法示例

    vue3如何避免样式污染的方法示例

    本文主要介绍了vue3如何避免样式污染的方法示例,使用scoped可以避免父组件的样式渗透到子组件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • vue3使用echarts绘制折线图的代码示例

    vue3使用echarts绘制折线图的代码示例

    这篇文章主要为大家学习介绍了Vue3如何使用echarts实现绘制折线图,文中有详细的示例代码供大家参考,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-07-07
  • 如何利用Vue元素指令自动合并tailwind类名

    如何利用Vue元素指令自动合并tailwind类名

    文章介绍了如何在Vue项目中使用tailwind-merge库通过自定义指令自动合并Tailwind CSS类名,以解决样式冲突和提高代码的可维护性,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • vue+iview如何实现拼音、首字母、汉字模糊搜索

    vue+iview如何实现拼音、首字母、汉字模糊搜索

    这篇文章主要介绍了vue+iview如何实现拼音、首字母、汉字模糊搜索,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue + Vite项目通过/dist子路径访问首页空白问题的完整分析与解决方案

    Vue + Vite项目通过/dist子路径访问首页空白问题的完整分析与解决方案

    在前端工程化实践中,将Vue应用构建后部署到 Nginx是一件再常见不过的事情,然而,当项目需要以子路径形式部署时,却经常会遇到页面能访问,但首页内容为空白,本文将围绕通过域名/dist/访问 Vue+Vite项目首页空白这一典型问题,并给出一套完整、可复用的解决方案
    2026-01-01
  • vue2响应式原理之Object.defineProperty()方法的使用

    vue2响应式原理之Object.defineProperty()方法的使用

    这篇文章主要介绍了vue2响应式原理之Object.defineProperty()方法的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • vue3+vite实现在线预览pdf功能

    vue3+vite实现在线预览pdf功能

    这篇文章主要为大家详细介绍了如何通过vue3和vite实现在线预览pdf功能,文中的示例代码简洁易懂,具有一定的借鉴价值,感兴趣的小伙伴可以学习一下
    2023-10-10
  • Vue中的v-for列表循环示例详解

    Vue中的v-for列表循环示例详解

    循环使用v-for指令,v-for指令需要以site in sites形式的特殊语法,sites是源数据数组并且site是数组元素迭代的别名,下面这篇文章主要给大家介绍了关于Vue中v-for列表循环的相关资料,需要的朋友可以参考下
    2022-11-11
  • Vue Cli项目重构为Vite的方法步骤

    Vue Cli项目重构为Vite的方法步骤

    本文主要介绍了Vue Cli项目重构为Vite的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论