首页 > 其他分享 >本地存储(localStorage)如何设置过期时间?

本地存储(localStorage)如何设置过期时间?

时间:2023-01-27 20:32:35浏览次数:49  
标签:存储 过期 Dictionaries value expire localStorage key export

本地存储(localStorage)如何设置过期时间?_html

思考

在我们使用​​cookie​​​的时候是可以设置有效期的,但是​​localStorage​​​本身是没有该机制的,只能人为的手动删除,否则会一直存放在浏览器当中,可不可以跟cookie一样设置一个有效期。如果一直存放在浏览器又感觉有点浪费,那我们可以把​​localStorage​​进行二次封装实现该方案。

实现思路

在存储的时候设置一个过期时间,并且存储的数据进行格式化方便统一校验,在读取的时候获取当前时间进行判断是否过期,如果过期进行删除即可。

代码实现

目录结构

本地存储(localStorage)如何设置过期时间?_Storage_02

enum ts 定义枚举

//字典 Dictionaries    expire过期时间key    permanent永久不过期
export enum Dictionaries {
expire = '__expire__',
permanent = 'permanent'
}

type ts 定义类型

import { Dictionaries } from "../enum"
export type Key = string //key类型
export type expire = Dictionaries.permanent | number //有效期类型
export interface Data<T> { //格式化data类型
value: T
[Dictionaries.expire]: Dictionaries.expire | number
}
export interface Result<T> { //返回值类型
message: string,
value: T | null
}
export interface StorageCls { //class方法约束
set: <T>(key: Key, value: T, expire: expire) => void
get: <T>(key: Key) => Result<T | null>
remove: (key: Key) => void
clear: () => void
}

index.ts 主要逻辑实现

import { StorageCls, Key, expire, Data,Result } from "./type";
import { Dictionaries } from "./enum";
export class Storage implements StorageCls {
//存储接受 key value 和过期时间 默认永久
public set<T = any>(key: Key, value: T, expire: expire = Dictionaries.permanent) {
//格式化数据
const data = {
value,
[Dictionaries.expire]: expire
}
//存进去
localStorage.setItem(key, JSON.stringify(data))
}

public get<T = any>(key: Key):Result<T | null> {
const value = localStorage.getItem(key)
//读出来的数据是否有效
if (value) {
const obj: Data<T> = JSON.parse(value)
const now = new Date().getTime()
//有效并且是数字类型 并且过期了 进行删除和提示
if (typeof obj[Dictionaries.expire] == 'number' && obj[Dictionaries.expire] < now) {
this.remove(key)
return {
message:`您的${key}已过期`,
value:null
}
}else{
//否则成功返回
return {
message:"成功读取",
value:obj.value
}
}
} else {
//否则key值无效
console.warn('key值无效')
return {
message:`key值无效`,
value:null
}
}
}
//删除某一项
public remove(key:Key) {
localStorage.removeItem(key)
}
//清空所有值
public clear() {
localStorage.clear()
}
}

rollup.js ​​简易打包暂时没有写的很复杂​​ 所用到的依赖 rollup rollup-plugin-typescript2 typescript

import ts from 'rollup-plugin-typescript2'
import path from 'path'
export default {
input:'./src/index.ts',
output:{
file:path.resolve(__dirname,'./dist/index.js')
},
plugins:[
ts()
]
}

代码测试

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>

<body>
<script type="module">
import { Storage } from './dist/index.js'
const sl = new Storage()
//五秒后过期
sl.set('a', 123, new Date().getTime() + 5000)

setInterval(() => {
const a = sl.get('a')
console.log(a)
},500)
</script>
</body>

</html>

测试五秒后过期增加计时器观察值

过期之后 成功删除 测试成功

本地存储(localStorage)如何设置过期时间?_typescript_03

标签:存储,过期,Dictionaries,value,expire,localStorage,key,export
From: https://blog.51cto.com/u_13463935/6024293

相关文章

  • PostgreSQL(四)存储结构
    先上一张图:这是 PostgreSQL的 DMS管理方式,与oracle管理一样。DMS(databasemanagementspace)数据库管理空间,数据库中管理,容器是预分配的文件。SMS(systemmanagementsp......
  • 编写代码实现:求一个整数存储在内存中的二进制中1的个数
    目的:统计num的补码中有几个1法一#include<stdio.h>intmain(){intnum=0;intcount=0;scanf("%d",&num);//3--011//二进制:模2除2while(num)//因为二进制只有0和1,......
  • mysql存储过程和游标
    创建存储过程存储过程和定义函数相似,使用CREATEPROCEDURE 存储名(),BEGIN 和END之间为“函数体”。CREATETABLEBlog(authorVARCHAR(25),blogTEXT,......
  • MySQL高级【存储过程】
    1:存储过程1.1:介绍存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于......
  • cookie、session、localStorage、sessionStorage区别
    cookie和session参与服务器通信,而localStorage和sessionStorage不参与服务器通信。cookie和session的区别数据存储位置有区别:cookie保存在浏览器端,session保存在服务器......
  • 函数计算与对象存储实现MapReduce
    Serverless架构可以在很多领域发挥极具价值的作用,包括监控告警、人工智能、图像处理、音视频处理等。同样,在大数据领域,Serverless架构仍然可以有良好的表现。以WordCount为......
  • 边缘存储和网络资源
    由于目前在KubeEdge中与网络相关的资源是随着存储一起下发的,因此所要梳理的网络资源和存储的管理流程其实是KubeEdge中存储的管理流程,如下所示。 KubeEdge中边缘存储和......
  • 进程间通信常见方式(4种,这里说管道、fifo、共享存储映射)
    学习地址IPC即进程间通信进程间通信框架如下:进程间通信方式如下:管道得有血缘关系管道前提作用于有血缘关系的进程间插曲mkfifof1实现原理内核借助环形......
  • 【Azure 存储服务】.NET7.0 示例代码之上传大文件到Azure Storage Blob (一)
    问题描述在使用Azure的存储服务时候,如果上传的文件大于了100MB,1GB的情况下,如何上传呢? 问题解答使用Azure存储服务时,如果要上传文件到AzureBlob,有很多种工具可以实现。如:A......
  • mendeley存储是有限的吗
    用了mendeley好多年,总是有一个疑问,那就是这东西的云存储空间是不是有限的,如果是有限的话那么上限是多少?这东西不论是app还是桌面端都没有这个空间信息的大小,但是这东西必然......