11vue3实战-----封装缓存工具

news2025/2/12 2:08:09

11vue3实战-----封装缓存工具

  • 1.背景
  • 2.pinia的持久化思路
  • 3.以localStorage为例解决问题
  • 4.封装缓存工具

1.背景

在上一章节,实现登录功能时候,当账号密码正确,身份验证成功之后,把用户信息保存起来,是用的pinia。然而pinia一刷新之后内部的数据(比如token)就会消失。为了解决该问题,必须将pinia持久化。

2.pinia的持久化思路

常见的解决方法有sessionStorage和localStorage,大家可以根据公司的需求来选择。两种方法都能保证刷新时候pinia内部数据依然存在,只不过使用sessionStorage这种方法,当关闭浏览器的会话时候,数据会消失。

3.以localStorage为例解决问题

store/login/login.ts:

import { defineStore } from 'pinia'
import { accountLoginRequest } from '@/service/login/login'
import type { IAccount } from '@/types'
const useLoginStore = defineStore('login', {
  state: () => ({
    id: '',
    token: localStorage.getItem('token') ?? '',
    name: ''
  }),
  actions: {
    async loginAccountAction(account: IAccount) {
      // 1.账号登录, 获取token等信息
      const loginResult = await accountLoginRequest(account)
      this.id = loginResult.data.id
      this.name = loginResult.data.name
      this.token = loginResult.data.token
      // 2.进行本地缓存
      localStorage.setItem('token', this.token)
    }
  }
})
export default useLoginStore

以上就可以解决问题。但如果所有的数据都按以上的格式书写代码,比较麻烦。而且,当某些数据是复杂对象时候,用localStorage.setItem进行存储时候,需要用JSON.stringify将复杂对象转为字符串(localStorage、sessionStorage只能存储字符串类型的数据)。同时在state里面又需要将其用JSON.parse转回对象。
所以最好是将localStorage进行封装。

4.封装缓存工具

新建工具文件夹utils,新建一个cache.ts文件:
在这里插入图片描述
utils/cache.ts:

//枚举两种类型,表示localStorage和sessionStorage
enum CacheType {
  Local,
  Session
}

class Cache {
  //localStorage和sessionStorage都是Storage类型;
  storage: Storage

  constructor(type: CacheType) {
    this.storage = type === CacheType.Local ? localStorage : sessionStorage
  }
  setCache(key: string, value: any) {
    if (value) {
      this.storage.setItem(key, JSON.stringify(value))
    }
  }
  getCache(key: string) {
    const value = this.storage.getItem(key)
    if (value) {
      return JSON.parse(value)
    }
  }
  removeCache(key: string) {
    this.storage.removeItem(key)
  }
  clear() {
    this.storage.clear()
  }
}
const localCache = new Cache(CacheType.Local)
const sessionCache = new Cache(CacheType.Session)
export { localCache, sessionCache }

在store/login/login.ts中使用缓存工具:

import { defineStore } from 'pinia'
import { accountLoginRequest } from '@/service/login/login'
import type { IAccount } from '@/types'
import { localCache } from '@/utils/cache'
//这里把字符串'token'换成常量更规范,减少了拼错字符串的可能性,所有“login/token”的地方都可以用LOGIN_TOKEN ;
const LOGIN_TOKEN = 'login/token'
const useLoginStore = defineStore('login', {
  state: () => ({
    id: '',
    token: localCache.getCache(LOGIN_TOKEN) ?? '',
    name: ''
  }),
  actions: {
    async loginAccountAction(account: IAccount) {
      // 1.账号登录, 获取token等信息
      const loginResult = await accountLoginRequest(account)
      console.log(loginResult)
      this.id = loginResult.data.id
      this.name = loginResult.data.name
      this.token = loginResult.data.token
      // 2.进行本地缓存
      localCache.setCache(LOGIN_TOKEN, this.token)
    }
  }
})

export default useLoginStore

当然除了自己封装缓存工具,还可以用pinia持久化插件------pinia-plugin-persistedstate解决问题。可上网自行搜索一下。(https://blog.csdn.net/qq_44741577/article/details/135959968)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 基础编程

在这个练习中将新建unity脚本,控制player的运动与转动,实现用代码检测碰撞与删除物体。 该练习将应用附件中的项目文件,该文件与Unity快速练习的文件是同一个项目文件。 一、构建Player运动脚本 该部分将构建一个在场景中由玩家控制游戏物…

Spring Boot接入Deep Seek的API

1,首先进入deepseek的官网:DeepSeek | 深度求索,单击右上角的API开放平台。 2,单击API keys,创建一个API,创建完成务必复制!!不然关掉之后会看不看api key!!&…

从Word里面用VBA调用NVIDIA的免费DeepSeekR1

看上去能用而已。 选中的文字作为输入,运行对应的宏即可;会先MSGBOX提示一下,然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…

C语言学习笔记:子函数的调用实现各个位的累加和

在C语言程序学习之初,我们都会学习如何打印 hello world,在学习时我们知道了int main()是主函数,程序从main函数开始执行,这是流程控制的一部分内容。在主函数中我们想要实现一些功能,比如求各个…

grafana面板配置opentsdb

新增面板: 这里add-panel: 如果不是想新增面板而是想新增一行条目,则点击convert to row: 在新增的面板这里可以看到选择数据源 Aggregator:聚合条件,区分下第一行和第二行的aggregator,第一个是对指标值的聚合&…

2025年02月10日Github流行趋势

项目名称:dify 项目地址url:https://github.com/langgenius/dify项目语言:TypeScript历史star数:64707今日star数:376项目维护者:takatost, crazywoola, laipz8200, iamjoel, JohnJyong项目简介&#xff1a…

Ansible简单介绍及用法

一、简介 Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)。主版本大概每2个月发布一次。 Ansible与Saltstack最大的区别是…

渗透利器工具:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)

Burp Suite 联动 XRAY 图形化工具.(主动扫描被动扫描) Burp Suite 和 Xray 联合使用,能够将 Burp 的强大流量拦截与修改功能,与 Xray 的高效漏洞检测能力相结合,实现更全面、高效的网络安全测试,同时提升漏…

HTML-day1(学习自用)

目录 一、HTML介绍 二、常用的标签 1、各级标题(h1-h6) 2、段落标签(p) 3、文本容器(span) 4、图片标签(img) 5、超链接标签(a) 6、表格(t…

Vue07

一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以管理 Vue 通用的数据 (多组件共享的数据)。例如:购物车数…

Godot开发框架探索#2

前言 距离上次发文又又又隔了很长一段时间。主要原因还是因为思绪在徘徊,最近纠结的点有以下几个:1.渴求一个稳定的Godot开发框架;2.要不要使用更轻量的开发框架,或者直接写引擎; 3.对自己想做的游戏品类拿不定主意。…

deepseek实现私有知识库

前言 之前写了如何本地部署deepseek,已经可以私有化问答了,本地搭建deepseek实操(ollama搭建,docker管理,open-webui使用) 其中我觉得最厉害的还是这个模型蒸馏,使我们可以用很低的代价使用大模…

【探索未来科技】2025年国际学术会议前瞻

【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议( EIBDCT 2025)代码示例:机器学习中的线性回…

大模型基本原理(四)——如何武装ChatGPT

传统的LLM存在几个短板:编造事实、计算不准确、数据过时等,为了应对这几个问题,可以借助一些外部工具或数据把AI武装起来。 实现这一思路的框架包括RAG、PAL、ReAct。 1、RAG(检索增强生成) LLM生成的内容会受到训练…

开发完的小程序如何分包

好几次了,终于想起来写个笔记记一下 我最开始并不会给小程序分包,然后我就各种搜,发现讲的基本上都是开发之前的小程序分包,可是我都开发完要发布了,提示我说主包太大需要分包,所以我就不会了。。。 好了…

java配置api,vue网页调用api从oracle数据库读取数据

一、主入口文件 1:java后端端口号 2:数据库类型 和 数据库所在服务器ip地址 3:服务器用户名和密码 二、映射数据库表中的数据 resources/mapper/.xml文件 1:column后变量名是数据库中存储的变量名 property的值是column值的…

iOS三方登录 - Facebook登录

引言 在出海APP的开发中,集成主流社交平台的三方登录已成为必不可少的一环。Facebook 作为全球最大的社交网络平台之一,其提供的 Facebook 登录功能能够大大简化用户注册和登录流程,提高用户体验,减少流失率。对于开发者而言&…

机器学习 - 理解偏差-方差分解

为了避免过拟合,我们经常会在模型的拟合能力和复杂度之间进行权衡。拟合能力强的模型一般复杂度会比较高,容易导致过拟合。相反,如果限制模型的复杂度,降低其拟合能力,又可能会导致欠拟合。因此,如何在模型…

深度学习01 神经网络

目录 神经网络 ​感知器 感知器的定义 感知器的数学表达 感知器的局限性 多层感知器(MLP, Multi-Layer Perceptron) 多层感知器的定义 多层感知器的结构 多层感知器的优势 偏置 偏置的作用 偏置的数学表达 神经网络的构造 ​神经网络的基本…

自动化xpath定位元素(附几款浏览器xpath插件)

在 Web 自动化测试、数据采集、前端调试中,XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大,但面对复杂 DOM 结构时,XPath 仍然更具灵活性。因此,掌握 XPath,不仅能提高自动化测试的稳定性,还能在爬…