前端:兼容 cookie 和 localStorage 类,且可设置过期时限

前言

兼容 CookielocalStorage 两种方式,且都可设置过期时限;

初始化

init(type, timeOut)

参数

名称类型描述
typeString存储方式。支持 2 种类型:cookie(存储值最大为 4KB)、localStorage(存储值最大为 5M)
timeOutNumber过期时限。单位为小时,例如 7 * 24 为 7 天

返回

Booleantrue 表示初始化成功,false 表示已初始化;

示例

初始化方法 Storage.init ,仅第一次生效;

// 初始化为 localStorage 类型,7 天过期
Storage.init('localStorage', 7 * 24);

方法

set(key, val)

  • 保存;
  • 返回:无;
  • 参数如下:
名称类型描述
keyString唯一标识
valObject存储值

get(key)

  • 获取;
  • 返回:被存储的值,过期为 null
  • 参数如下:
名称类型描述
keyString唯一标识

remove(key)

  • 移除;
  • 返回:Booleantrue 成功,false 失败;
  • 参数如下:
名称类型描述
keyString唯一标识

exist(key)

  • 判断对象是否存在;
  • 返回:Booleantrue 存在,false 过期或移除;
  • 参数如下:
名称类型描述
keyString唯一标识

clear()

  • 清空全部;
  • 返回:无;
  • 参数:无;

示例

此处使用 Vue2.x

<template><div><button @click="onclick(0)">存储</button><button @click="onclick(1)">获取</button><button @click="onclick(2)">删除</button><button @click="onclick(3)">清空</button><button @click="onclick(4)">获取keys</button></div>
</template><script>
import Storage from '../js/Storage'
export default {methods: {onclick(i) {switch (i) {case 0: {Storage.set('my_test', true);break;}                    case 1: {let val = Storage.get('my_test', false);console.log('my_test', val);break;}case 2: {Storage.remove('my_test');break;}case 3: {Storage.clear();break;}      case 4: {let keys = Storage.getKeys();console.log('keys', keys);break;}       default:break;}}},mounted() {// 初始化Storage.init('localStorage');// Storage.init('cookie');}
}
</script>

真正的实现

文件 Storage.js,文件分三部分 MyCookieMyLocalStorageStorage

// 唯一key
const MY_KEYS = '_My_Storage_Keys'class MyCookie {constructor() {this.keys = [MY_KEYS]this.lastTime = nulllet flag = falselet name = `${MY_KEYS}=`let ca = document.cookie.split(';')for (let i = 0; i < ca.length; i++) {let c = ca[i].trim()if (c.indexOf(name) == 0)flag = true}this.keys = flag ? this.get(MY_KEYS) : []}getKeys() {return this.keys}setHistory(timeOut) {timeOut = timeOut || this.lastTimelet d = new Date()d.setTime(d.getTime() + (timeOut * 60 * 60 * 1000))let expires = 'expires=' + d.toGMTString()document.cookie = `${MY_KEYS}=` + JSON.stringify({ data: this.keys }) + '; ' + expiresthis.lastTime = timeOut}set(key, val, timeOut) {let d = new Date()d.setTime(d.getTime() + (timeOut * 60 * 60 * 1000))let expires = 'expires=' + d.toGMTString()document.cookie = key + '=' + JSON.stringify({ data: val }) + '; ' + expiresthis.keys.indexOf(key) < 0 && this.keys.push(key) && this.setHistory(timeOut)}get(key) {if (!this.exist(key))return nulllet name = key + '='let ca = document.cookie.split(';')for (let i = 0; i < ca.length; i++) {let c = ca[i].trim()if (c.indexOf(name) === 0)return JSON.parse(c.substring(name.length, c.length)).data}}remove(key) {for (let i in this.keys) {if (key == this.keys[i]) {document.cookie = this.keys[i] + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT'this.keys.splice(i, 1)this.setHistory()return true}}return false}exist(key) {let name = key + '='let ca = document.cookie.split(';')for (let i = 0; i < ca.length; i++) {let c = ca[i].trim()if (c.indexOf(name) === 0)return true}this.remove(key)return this.keys.indexOf(key) > -1}clear() {for (let i in this.keys) {document.cookie = this.keys[i] + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT'}this.keys = [MY_KEYS]this.setHistory(0)}
}class MyLocalStorage {constructor() {this.keys = [MY_KEYS];this.keys = localStorage.getItem(MY_KEYS) ? this.get(MY_KEYS) : [];for (let i in this.keys) {this.exist(this.keys[i]);}}getKeys() {return this.keys;}setHistory() {localStorage.setItem(MY_KEYS, JSON.stringify({ data: this.keys })) //转换成json字符串序列}set(key, val, timeOut) {let cur = new Date().getTime()localStorage.setItem(key, JSON.stringify({ data: val, time: cur, timeOut: timeOut })) //转换成json字符串序列this.keys.indexOf(key) < 0 && this.keys.push(key) && this.setHistory()}get(key) {if (!this.exist(key))return nulllet val = localStorage.getItem(key) //获取存储的元素let dataObj = JSON.parse(val) //解析出json对象if (dataObj.timeOut != null && (new Date().getTime() - dataObj.time > dataObj.timeOut * 60 * 60 * 1000)) //如果当前时间-减去存储的元素在创建时候设置的时间 > 过期时间{return null} else {return dataObj.data}}remove(key) {for (let i in this.keys) {if (key == this.keys[i]) {localStorage.removeItem(this.keys[i])this.keys.splice(i, 1)this.setHistory()return true}}return false}exist(key) {let val = localStorage.getItem(key) //获取存储的元素let dataObj = JSON.parse(val) //解析出json对象if (dataObj && dataObj.timeOut != null && (new Date().getTime() - dataObj.time > dataObj.timeOut * 60 * 60 * 1000)) //如果当前时间-减去存储的元素在创建时候设置的时间 > 过期时间{this.remove(key)}return this.keys.indexOf(key) > -1}clear() {for (let i in this.keys) {localStorage.removeItem(this.keys[i])}this.keys = [MY_KEYS]this.setHistory()}
}class Storage {static init(type, timeOut) {// 仅初始化一次if (this.currentStorage) {return false;}this.type = type;this.timeOut = timeOut;this.storageFactory = {cookie: MyCookie,localStorage: MyLocalStorage,}this.currentStorage = new this.storageFactory[type]();return true;}static getKeys() {return this.currentStorage.getKeys()}static set(key, val) {this.currentStorage.set(`_My_Storage_${key}`, val, this.timeOut)}static get(key) {return this.currentStorage.get(`_My_Storage_${key}`);}static remove(key) {return this.currentStorage.remove(`_My_Storage_${key}`);}static exist(key) {return this.currentStorage.exist(`_My_Storage_${key}`);}static clear() {this.currentStorage.clear();}}export default Storage

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

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

相关文章

解码大语言模型奥秘:《大规模语言模型:从理论到实践》震撼上市!

2022年11月&#xff0c;ChatGPT的问世展示了大模型的强大潜能&#xff0c;对人工智能领域有重大意义&#xff0c;并对自然语言处理研究产生了深远影响&#xff0c;引发了大模型研究的热潮。 距ChatGPT问世不到一年&#xff0c;截至2023年10月&#xff0c;国产大模型玩家就有近2…

(1)(1.7) HOTT telemetry

文章目录 前言 1 布线和设置 2 参数说明 前言 Plane-4.0.0&#xff08;及更高版本&#xff09;、Copter-4.0.4&#xff08;及更高版本&#xff09;和 Rover-4.1.0&#xff08;及更高版本&#xff09;支持 Graupner HOTT 遥测技术。 1 布线和设置 与自动驾驶仪的连接可通过…

常用的线程锁

常用的锁 互斥锁&#xff08;Mutex Lock&#xff09; 用于保护共享资源&#xff0c;一次只允许一个线程访问共享资源&#xff0c;其他线程需要等待锁释放后才能访问。互斥锁是最常见的锁类型&#xff0c;用于避免多个线程同时访问共享资源而导致的数据竞争和不一致性。 读写锁…

C#基础——数组Array、数组API

C#基础——数组Array、数组API 1、数组&#xff1a;按照指定顺序存储指定数量的相同类型的值 声明数组 // 数组的长度根据存储值的数量进行自动推断int[] ints1 new int[] { 2, 4, 6, 8 };//可以简写为int[] ints2 { 2, 4, 6, 8 };// 定义数组时&#xff0c;指定数组长度in…

小间距LED显示屏的芯片扮演的关键角色

LED屏幕由数万颗灯珠封装而成&#xff0c;包含驱动芯片、PCB板、电阻、电容、模组套件和箱体等&#xff0c;形成一块高清LED显示屏。芯片的质量直接影响整个屏幕的品质、稳定性和性能。那么&#xff0c;什么是细间距LED显示屏&#xff1f;小间距LED显示屏芯片具体有何作用呢&am…

react-router-dom v6中优雅处理404重定向问题

在基于React的单页面应用&#xff08;SPA&#xff09;中&#xff0c;使用 react-router-dom 库来管理路由是一项关键任务。当用户访问一个不存在的页面时&#xff0c;我们通常希望能够以优雅的方式处理404情况&#xff0c;从而提升用户体验。本文将探讨如何在React应用中使用re…

OpenAI 承认 ChatGPT 最近确实变懒,承诺修复问题

文章目录 一. ChatGPT 指令遵循能力下降引发用户投诉1.1 用户抱怨回应速度慢、敷衍回答、拒绝回答和中断会话 二. OpenAI 官方确认 ChatGPT 存在问题&#xff0c;展开调查三. OpenAI 解释模型行为差异&#xff0c;回应用户质疑四. GPT-4 模型变更受人事动荡和延期影响 一. Chat…

【小沐学Python】Python实现语音识别(Whisper)

文章目录 1、简介1.1 whisper简介1.2 whisper模型 2、安装2.1 whisper2.2 pytorch2.3 ffmpeg 3、测试3.1 命令测试3.2 代码测试&#xff1a;识别声音文件3.3 代码测试&#xff1a;实时录音识别 4、工具4.1 WhisperDesktop4.2 Buzz4.3 Whisper-WebUI 结语 1、简介 https://gith…

Python 自动化之修理excel文件(二)

批量合成excel文档Pro版 文章目录 批量合成excel文档Pro版前言一、做成什么样子二、基本架构三、库输入模块四、用户输入模块五、数据处理模块1.获取当前目录的文件信息2.创建Workbook实例对象3.遍历entries列表4.获取Excel文件的工作表信息5.命名和写入数据 六、数据输出模块1…

ssm(springboot儿童众筹救助系统 儿童捐赠系统Java系统

ssm(springboot儿童众筹救助系统 儿童捐赠系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数…

[笔记] 使用 qemu/grub 模拟系统启动(多分区)

首先创建一块虚拟硬盘: dd bs512 count204800 if/dev/zero ofhd.img然后使用 losetup -f 将其关联为本地回环设备 losetup -f hd.img # 关联 hd.img 到空闲回环设备上 losetup -a /dev/loop0: [2080]:409 (/root/code/demo05/hd.img) # 查看刚刚关联到了哪里,这里关联到了 /d…

IEEE期刊论文模板

一、模板下载 1、登陆IEEE作者中心Author Center 地址&#xff1a;Publish with IEEE Journals - IEEE Author Center Journals 2、点击“Download a template” 3、在弹出的模板下载页面点击IEEE模板选择器“IEEE Template Selector” 4、在弹出的模板选择器页面点击“Tran…

分支预测失败的处理

由于现代的超标量处理器采用了很多预测的方法来执行指令,并不是流水线中所有的指令都可以退休(retire),例如当流水线中的某条分支指令发生了预测错误,或者某条指令发生了异常&#xff0c;那么在这条指令之后进入流水线的所有指令就不允许退休了&#xff1b; 此时需要将这些指令…

翻译: LLM大语言模型图像生成原理Image generation

文本生成是许多用户正在使用的&#xff0c;也是所有生成式人工智能工具中影响最大的。但生成式人工智能的一部分兴奋点也在于图像生成。目前也开始出现一些可以生成文本或图像的模型&#xff0c;这些有时被称为多模态模型&#xff0c;因为它们可以在多种模式中操作&#xff0c;…

代码随想录算法训练营第四十二天|背包问题理论基础、01背包理论基础(滚动数组)、416. 分割等和子集

代码随想录算法训练营第四十二天|背包问题理论基础、01背包理论基础&#xff08;滚动数组&#xff09;、416. 分割等和子集 背包问题理论基础 背包问题理论基础 文章讲解&#xff1a;https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E…

谈谈常用的分布式ID的设计方案?

典型回答 首先&#xff0c;我们需要明确通常的分布式ID定义&#xff0c;基本的要求包括&#xff1a; 全局唯一&#xff0c;区别于单点系统的唯一&#xff0c;全局是要求分布式系统内唯一。 有序性&#xff0c;通常都需要保证生成的ID是有序递增的。例如&#xff0c;在数据库存…

iframe 与主应用页面之间如何互相通信传递数据

背景 当我们的Web页面需要复用现有网站的页面时&#xff0c;我们通常会考虑代码层面的抽离引用&#xff0c;但是对于一些过于复杂的页面&#xff0c;通过 iframe 嵌套现有的网站页面也是一种不错的方式&#xff0c;。目前我就职的项目组就有多个业务利用 iframe 完成业务的复用…

springboot整合websocket实现控制输入流

WebSocket 是一种在客户端和服务器之间进行实时双向通信的协议。它提供了一种更高效、更可靠的替代方案&#xff0c;以替代传统的HTTP请求-响应模式。 WebSocket 的特点包括&#xff1a; 双向通信&#xff1a;客户端和服务器可以同时发送和接收消息&#xff0c;而不像HTTP一样需…

QT 基础篇

目录 QPushButton QT帮助文档 QT 对象树 QPushButton QPushButton是Qt图形界面控件中的一种&#xff0c;看英文的意思&#xff0c;他就是按钮&#xff0c;是最基本的图形控件之一。在我们的最基本的项目中&#xff0c;运行: 是一个空白的窗体&#xff0c;里面什么也没有&am…

云原生之深入解析如何在Kubernetes中快速启用Cgroup V2支持

一、cgroup v2 有哪些优势&#xff1f; Linux 中有两个 cgroup 版本&#xff1a;cgroup v1 和 cgroup v2。cgroup v2 是新一代的 cgroup API。Kubernetes 自 v1.25 起 cgroup2 特性正式 stable。cgroup v2 提供了一个具有增强资源管理能力的统一控制系统&#xff0c;cgroup v2…