如何给localStorage设置一个有效期?
原
荐
字数 1454
阅读 1
收藏 0
开发十年,就只剩下这套 Java 开发体系了 >>>
引言
这个话题其实在上次分享 <小程序填坑记里讲过了> 已经讲过( 大佬可绕过哦~
),但后来QQ里/评论都有些同学,提到了一些疑问,问能否单独整理一篇更为详细的分享,讲解一下细节和完善提到的不足,如是有了下文。
这里是 @IT·平头哥联盟 ,我是 首席填坑官
— 苏南 ,用心分享 做有温度的攻城狮。
G众H: honeyBadger8
,交-流:912594095
思考点
从我们接触前端起,第一个熟悉的存储相关的Cookie或者来分析我们生活中密切相关的淘宝、物流、闹钟等事物来说起吧,
订单结束
!> 以上种种,我们能得出一个结论任何一件事、一个行为动作,都有一个时间、一个节点,甚至我们可以黑 localStorage
,就是一个完善的API,为什么不能给一个设置过期的机制,因为 sessionStorage
、 Cookie
并不能满足我们实际的需求。
实现思路
抱歉,黑 localStorage
不完善,有点夸张了,综合上述的总结,问题就简单了,给 localStorage
一个过期时间,一切就都so easy ?到底是不是,来看看具体的实现吧:
简单回顾
//示例一: localStorage.setItem('test',1234567); let test = localStorage.getItem('test'); console.log(typeof test, test); //示例二: localStorage['name'] = '苏南'; console.log(localStorage['name']); /* 输出: "1234567" ,'苏南', 这里要注意,1234567 存进去时是number 取出来就成string了 */
重写 set(存入) 方法:
- 首先有三个参数 key、value、expired ,分别对应 键、值、过期时间,
- 过期时间的单位可以自由发挥,小时、分钟、天都可以,
- 注意 点:存储的值可能是数组/对象,不能直接存储,需要转换
JSON.stringify
, - 这个时间如何设置呢?在这个值存入的时候在键(key)的基础上扩展一个字段,如:key+' expires ',而它的值为当前 时间戳 + expired过期时间
- 具体来看一下代码 :
set(key, value, expired) { /* * set 存储方法 * @ param {String} key 键 * @ param {String} value 值, * @ param {String} expired 过期时间,以分钟为单位,非必须 * @ 由@IT·平头哥联盟-首席填坑官∙苏南 分享 */ let source = this.source; source[key] = JSON.stringify(value); if (expired){ source[`${key}__expires__`] = Date.now() + 1000*60*expired }; return value; }
重写 get(获取) 方法:
- 获取数据时,先判断之前存储的时间有效期,与当前的时间进行对比;
- 但存储时
expired
为非必须参数,所以默认为当前时间+1,即长期有效; - 如果存储时有设置过期时间,且在获取的时候发现已经小于当前时间戳,则执行删除操作,并返回空值;
- 注意 点:存储的值可能是数组/对象,取出后不能直接返回,需要转换
JSON.parse
, - 具体来看一下代码 :
get(key) { /* * get 获取方法 * @ param {String} key 键 * @ param {String} expired 存储时为非必须字段,所以有可能取不到,默认为 Date.now+1 * @ 由@IT·平头哥联盟-首席填坑官∙苏南 分享 */ const source = this.source, expired = source[`${key}__expires__`]||Date.now+1; const now = Date.now(); if ( now >= expired ) { this.remove(key); return; } const value = source[key] ? JSON.parse(source[key]) : source[key]; return value; }
重写 remove(删除) 方法:
- 删除操作就简单了,;
remove(key) { const data = this.source, value = data[key]; delete data[key]; delete data[`${key}__expires__`]; return value; }
优化点:
- 记得上次有个
同学
,是这么 评论 的:「 删除缓存能放到constructor里面执行么,放到get里面 不取就一直在那是不是不太好?」; - 为什么不用
for in
而是 for ?for in
循环遍历对象的属性时,原型链上的所有属性都将被访问,解决方案:使用hasOwnProperty
方法过滤或Object.keys会返回自身可枚举属性组成的数组;
class storage { constructor(props) { this.props = props || {} this.source = this.props.source || window.localStorage this.initRun(); } initRun(){ /* * set 存储方法 * @ param {String} key 键 * @ param {String} value 值,存储的值可能是数组/对象,不能直接存储,需要转换 JSON.stringify * @ param {String} expired 过期时间,以分钟为单位 * @ 由@IT·平头哥联盟-首席填坑官∙苏南 分享 */ const reg = new RegExp("__expires__"); let data = this.source; let list = Object.keys(data); if(list.length > 0){ list.map((key,v)=>{ if( !reg.test(key )){ let now = Date.now(); let expires = data[`${key}__expires__`]||Date.now+1; if (now >= expires ) { this.remove(key); }; }; return key; }); }; } }
总结:
以上就是今天为大家总结的分享,您GET到了吗?小程序、sessionStorage、localStorage,都适用,做些许调整即可哦,希望今天的分享能给您带来些许成长,如果觉得不错,记得关注下方 G众H 哦,每周第一时间为您推最新分享。
作者:苏南 - 首席填坑官
链接: https://blog.csdn.net/weixin_43254766/article/details/83618630
交-流:912594095、G众H: honeyBadger8
本文原创,著作权归作者所有。商业转载请联系 @IT·平头哥联盟
获得授权,非商业转载请注明原链接及出处。
© 著作权归作者所有
共有人打赏支持
加载中
评论( 1 )
删除一条评论
评论删除后,数据将无法恢复
取消
确定
相关文章 最新文章
1.cookie:存储在用户本地终端上的数据。有时也用cookies,指某些网站为了辨别用户身份,进行session跟踪而存储在本地终端上的数据,通常经过加密。一般应用最典型的案列就是判断注册用户是否...
半指温柔乐
01/08
0
0
08: Cookie && localStorage && Session Storage 缓存相关 客户端、前端 存储 一、 起 因 localStorage.setItem(key,value) 将value存储到key字段localStorage.removeItem(key) 删除指定key......
SmallW
08/01
0
0
共同点: 都是保存在浏览器端,且同源的 cookie有什么缺点? Cookie数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB 安全性问题。如果cookie被人拦截了,那人就...
君丶不易
2017/11/03
0
0
尽管 HTML5 规范在 2014 年之前不会有正式版本,很多设计师已经开始试水高级浏览器已经支持的部分 HTML5 功能。HTML5 为 Web 设计和应用开发打开了一扇全新的门,原生支持了以前只可能使用 ...
李长春
2012/03/02
0
1
早在几个星期前,Adobe就发布了Dreamweaver CS5 HTML5 Pack的预览版下载。众所周知,HTML5在互联网领域掀起了一场大论战,并让Adobe的日子很难熬。HTML5致力于为前端开发提供全面的标记语 言...
晨曦之光
2012/03/09
0
0
没有更多内容
加载失败,请刷新页面
加载更多如果你使用的是 Glassfish 作为你应用服务器,你不需要在你的引用中包含引用任何东西,所有你需要的都已经包含进去了。 你只需要定义 JAX-RS API 以便于你能够对你的应用进行编辑,使用 (p...
honeymose
今天
4
0
写在最前,测试博客在这里,直接欣赏完成可视化效果。代码不日在github公开,性能目前巨烂,RadialGradient损耗巨大,优化正在提上日程。 转载注明来源。 扒掉网页上js的烦请留下js里的顶端注...
御坂网络路由器
今天
4
0
Hi,好久不见,有没有想我啊 下载安装包 去 MongoDB Download Center 下载适合自己的版本。 安装 将安装包通过FTP上传到服务器,然后解压要自己的目录。 比如: # 解压tar -zxvf mongodb-li...
JAVA_冯文议
今天
4
0
服务器的启动 Redis 服务器的main函数是在server.c中。 // server.cint main(int argc, char **argv) { struct timeval tv; int j; /* 对服务器一些常量等进行设置 */ /*...
Jian_Ming
今天
2
0
Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ xiaoshiyue:分享Shawn Mendes的单曲《Never Be Alone / Hey There Delilah (Live At Madison Square Garden/ 2016 / Medley)》 《Never B......
小小编辑
今天
57
7
没有更多内容
加载失败,请刷新页面
加载更多以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- k8s踩坑记录——证书一年有效期
- [CentOS7]redis设置开机启动,设置密码
- hadoop地址配置、内存配置、守护进程设置、环境设置
- OpenMediaVault 设置
- scrapy代理的设置
- jvm的参数设置
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。