前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第九章 登录开发 (Pinia的使用和数据持久化)

news/2024/7/9 23:41:47 标签: 前端, pinia, vuex, vue, vue3

系列文章目录(点击查看)


文章目录


前言

PiniaVue 的存储库,它允许您跨组件/页面共享状态。 如果您熟悉 Composition API,您可能会认为您已经可以通过一个简单的 export const state = reactive({}). 这对于单页应用程序来说是正确的,但如果它是服务器端呈现的,会使您的应用程序暴露于安全漏洞。 但即使在小型单页应用程序中,您也可以从使用 Pinia 中获得很多好处:

  • dev-tools 支持
    • 跟踪动作、突变的时间线
    • Store 出现在使用它们的组件中
    • time travel 和 更容易的调试
  • 热模块更换
    • 在不重新加载页面的情况下修改您的 Store
    • 在开发时保持任何现有状态
  • 插件:使用插件扩展 Pinia 功能
  • 为 JS 用户提供适当的 TypeScript 支持或 autocompletion
  • 服务器端渲染支持

详情见官网:Pinia


vuex>vuex__25">一、对比 vuex>vuex 的优势

Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子,结合了 Vuex 5 核心团队讨论中的许多想法。与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的规范,提供了 Composition-API 风格的 API,最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持。

  1. Pinia 是为 Vue 3 设计的,因此它能够充分利用 Vue 3 的新特性和优势。

  2. Pinia 具有更简洁的 API 和更直观的用法,使得状态管理变得更加轻松和简单。

  3. Pinia 支持基于函数的状态定义,使得状态的管理和组织更加灵活和可预测。

  4. Pinia 还具有更好的性能表现,特别是在大型应用程序中可以更好地扩展和优化。

二、Pinia 的安装和配置

1、安装

# 使用 yarn
yarn add pinia
# 使用 npm
npm install pinia

在这里插入图片描述

2、配置

在 src 文件下创建 store 文件夹,并在其中创建 index.ts 文件,配置如下

import { createPinia } from 'pinia'

const store = createPinia()

export default store

在 store 文件下创建 modules 文件夹,并在其中创建 user.ts 文件,配置如下

import { defineStore } from 'pinia'
import { Local } from '@/cache'

const useUserStore = defineStore('user', {
  state: () => ({
    userInfo: {
      id: '',
      username: '',
      nickname: '',
      roles: []
    } // 用户信息
  }),

  actions: {
    SET_USER_INFO(info: any) {
      this.userInfo = info
    },
    LOGOUT() {
      this.userInfo = {
        id: '',
        username: '',
        nickname: '',
        roles: []
      }
      Local.clear()
    }
  }
})

export default useUserStore

具体的 userInfo 用户信息属性根据自己项目配置即可。

mian.ts 中

import { createApp } from 'vue'
import App from './App.vue'

import 'normalize.css'
import './styles/index.scss'

import router from './router'
import store from './store' // 新增
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App)

app.use(router)
app.use(store) // 新增
app.use(ElementPlus)

app.mount('#app')

3、测试

在 login 文件下 index.vue 中添加代码


import useUserStore from "@/store/modules/user"; // 新增

const userStore = useUserStore(); // 新增

const userLoginFunc = () => {
  loading.value = false;
   // 新增
  userStore.SET_USER_INFO({
    id: 1,
    username: "test",
    nickname: "测试账号",
    roles: ["admin", "test"],
  });
  router.push({ path: "/home" });
};

在这里插入图片描述
这里看到已经打印出我们添加的假数据了。

三、数据持久化

1、为什么要做持久化

当我们在 home 页刷新界面时,我们重新获取用户数据,我们可以看到数据为空。这时候我们就要用到数据持久化。数据持久化是一种重要的技术,它能够确保数据在系统关闭或重启后仍然能够被保留和访问。对于 Pinia 而言,数据持久化可以帮助确保用户的数据在页面重新加载或用户会话结束后仍然保持完整性和可访问性。这样可以提升系统的稳定性,用户体验也会得到改善,因为他们不需要在每次会话中重新输入数据。

在这里插入图片描述

piniapluginpersistedstate_153">2、pinia-plugin-persistedstate插件

pinia-plugin-persistedstate 是适用于 Pinia 的持久化存储插件。

  1. 简单易用:受 vuex>vuex-persistedstate 的启发而创建,你可以在 Pinia 上使用类似简单并且熟悉的 API。

  2. 高度可定制性:你可以自定义存储方式,自定义序列化配置和存储目标,并且可以对每个 Store 进行单独配置。

  3. 随处可用:兼容 Vue2 和 3Nuxt(SSR)以及所有可以使用 Pinia 的产品。

# 使用 yarn
yarn add pinia-plugin-persistedstate
# 使用 npm
npm install pinia-plugin-persistedstate

在这里插入图片描述

store 下 index.ts

import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

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

export default store

user.ts 中添加持久化配置

const useUserStore = defineStore('user', {
  state: () => ({
    // ......
  }),
  
  persist: true, // 添加 persist 属性
  
  actions: {
    // ......
  }
})

export default useUserStore

3、界面效果

在这里插入图片描述

持久化配置之后,我们可以随意获取到用户信息。


总结

本文介绍了简单介绍了如何在项目中使用 Pinia。其优势包括支持 dev-tools、热模块更换、插件扩展、提供良好的 TypeScript 支持和服务器端渲染支持等。介绍了如何安装和配置 Pinia,以及使用 pinia-plugin-persistedstate 插件可实现数据持久化,提升系统稳定性和用户体验。上文中的配置代码可在 github 仓库中直接 copy,仓库路径:https://github.com/SmallTeddy/testing-web。


http://www.niftyadmin.cn/n/5212212.html

相关文章

从0开始学习JavaScript--JavaScript数据类型与数据结构

JavaScript作为一门动态、弱类型的脚本语言,拥有丰富的数据类型和数据结构,这些构建了语言的基础,为开发者提供了灵活性和表达力。本文将深入探讨JavaScript中的各种数据类型,包括基本数据类型和复杂数据类型,并介绍常…

es6中的import导入模块 和 export导出模块

es6中的import导入模块 和 export导出模块 一、定义二、使用1.默认导出导入2..命名导出导入3.命名导出(Named Export)与默认导出(Default Export)结合使用 三、总结 一、定义 功能:用于导入和导出模块的内容。 静态加载…

waitnotify

文章目录 代码演示wait() - 阻塞等待notify() - 通知唤醒notifyAll() - 全部唤醒wait 和 sleep 的比较 由于线程之间是 抢占式执行的,因此 线程之间执行的先后顺序难以预知. 但是实际开发中有时候我们希望 合理的协调多个线程之间的执行先后顺序。join()方法也可…

Arduino库之 LedControl 库说明文档

LedControl 库最初是为基于 8 位 AVR 处理器的 Arduino 板编写的。但由于该代码不使用处理器的任何复杂的内部功能,因此具有高度可移植性,并且应该在任何支持 和 功能的 Arduino(类似)板上pinMode()运行digitalWrite() 。 单个 M…

Go语言的学习笔记2——Go语言源文件的结构布局

用一个只有main函数的go文件来简单说一下Go语言的源文件结构布局,主要分为包名、引入的包和具体函数。下边是main.go示例代码: package mainimport "fmt"func main() { fmt.Println("hello, world") }package main就是表明这个文件…

linux 安装yum

问题1:File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ 问题2:yum File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ vim /usr/…

Java反射调用kotlin中的类,Object类,Companion对象

Java反射调用kotlin中的类,Object类,Companion对象 1. Java反射调用kotlin中的普通类 kotlin普通类: package com.common; class TestNormal {fun get():String{return "Nolmal abc"}fun showNum(v:Int){println("Nolmal s…

DGL在异构图上的GraphConv模块

回顾同构图GraphConv模块 首先回顾一下同构图中实现GraphConv的主要思路(以GraphSAGE为例): 在初始化模块首先是获取源节点和目标节点的输入维度,同时获取输出的特征维度。根据SAGE论文提出的三种聚合操作,需要获取所…