引言

​  这个话题其实在上次分享<小程序填坑记里讲过了>已经讲过(大佬可绕过哦~),但后来群里/评论都有些同学,提到了一些疑问,问能否单独整理一篇更为详细的分享,讲解一下细节和完善提到的不足,如是有了下文?。

这里是@IT·平头哥联盟,我是首席填坑官—苏南,用心分享 做有温度的攻城狮。
公Z号:honeyBadger8,群:912594095

思考点

  从我们接触前端起,第一个熟悉的存储相关的Cookie或者来分析我们生活中密切相关的淘宝、物流、闹钟等事物来说起吧,

  • Cookie从你设置的时候,就会给个时间,不设置默认会话结束就过期;
  • 淘宝购物 从你下单付款起,就会给这件货物设置一个收货期限时间,过了这个时间自动认为你收货(即订单结束);
  • 闹钟 你设置的提醒时间,其实也就是它的过期时间;
  • 再比如与您每天切身相关的产品需求,过完需求,你给出的上线时间,也就是这个需求的过期时间;
  • 再通俗点讲,您今年的生日过完到明年生日之间也是相当于设置了有效期时间;

以上种种,我们能得出一个结论任何一件事、一个行为动作,都有一个时间、一个节点,甚至我们可以黑localStorage,就是一个完善的API,为什么不能给一个设置过期的机制,因为sessionStorageCookie并不能满足我们实际的需求。

实现思路

  抱歉,黑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.localStoragethis.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,都适用,做些许调整即可哦,希望今天的分享能给您带来些许成长,如果觉得不错,记得点个赞哦,顺便关注下方公Z号就更棒了,每周为您推最新分享??。

用心分享,做有温度的攻城狮!

作者:苏南 - 首席填坑官
链接:blog.csdn.net/weixin_4325…
交流群:912594095、公众好:honeyBadger8
本文原创,著作权归作者所有。商业转载请联系@IT·平头哥联盟获得授权,非商业转载请注明原链接及出处。

如何给localStorage设置一个过期时间?相关推荐

  1. 在Redis中设置了过期时间的Key,需要注意哪些问题?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:千山qianshan juejin.im/post/5d6b ...

  2. fastjson 添加key value_Redis中设置了过期时间的Key,那么你还要知道些什么?

    来源:http://i7q.cn/4NHBun 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 1. DEL/SET/GE ...

  3. 在 Redis 中设置了过期时间的 Key,需要注意哪些问题?

    熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过期时间需要注意的事项 1. DEL/SET/GETSET等 ...

  4. 【干货】在Redis中设置了过期时间的Key怎么办?

    熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过期时间需要注意的事项 1. DEL/SET/GETSET等 ...

  5. 在Redis中设置了过期时间的Key注意事项

    作者:千山qianshan juejin.im/post/5d6bda096fb9a06acc009dc8 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的 ...

  6. 设置过期时间_在Redis中设置了过期时间的Key,需要注意哪些问题?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:千山qianshan juejin.im/post/5d6b ...

  7. c# redis 如何设置过期时间_Spring cache整合Redis,并给它一个过期时间!

    小Hub领读: 不知道你们有没给cache设置过过期时间,来试试? 上一篇文章中,我们使用springboot集成了redis,并使用RedisTemplate来操作缓存数据,可以灵活使用. 我才懂! ...

  8. 转:设置session过期时间

    原文地址:设置session过期时间 Session一直是我们做web项目经常使用的,以前没太注意,这次又细致的看了下! 1.session其实就是一个Map,键=值对,通过session.getAt ...

  9. cookielifetime php_php中实现精确设置session过期时间的方法

    大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下session过期时间. 对此,可以在PHP中,设置php.ini,找到session. ...

最新文章

  1. ps -ef 的含义
  2. 切换Python2和Python3的方法
  3. 1500+ FPS!目前最快的CNN人脸检测算法开源
  4. bzoj 3232 圈地游戏——0/1分数规划(或网络流)
  5. 近期H5项目开发小结
  6. Java CAS 和ABA问题
  7. 记一次反制追踪溯本求源
  8. 一步一步学VBScript(4)之WSH对象三
  9. 关于IIS不能浏览ASP网页 和不能浏览后台(转)
  10. 【经典算法】第一回:快速排序
  11. Zookeeper案例之监听配置中心
  12. [境内法规]中国人民银行关于分支行反洗钱工作的指导意见—银发[2005]56号
  13. 【ArcGIS风暴】ArcGIS支持的栅格数据格式大全及格式转换案例精解
  14. “没有存在感”是一种什么感受?
  15. Wallis公式(点火公式)
  16. 张小龙回应一切!2019微信公开课一人撑到半夜,4小时演讲3万字实录
  17. 美通社日历 | 媒体关注、会展信息、企业财报发布,节假日备忘(8月3日—8月9日)...
  18. 离散数学-图论-欧拉图、哈密顿图、二部图、平面图(14)
  19. crackme01——Acid_burn
  20. 云联惠认证时间_警方要求云联惠涉案成员限期投案,是自首寻求轻判的最佳时机...

热门文章

  1. Oracle三级联动单表地址数据
  2. Oracle数据库的语句级读一致性
  3. bLock 回调 就是这么简单!
  4. AWARD BIOS设置详解
  5. 鼠标滑过某一个图标时,提示讯息
  6. virtualbox vm linux 动态获取ip
  7. 神经网络模型中class的forward函数何时调用_用Keras从零开始6步骤训练神经网络
  8. 解决fitz模块报错
  9. Xamarin XAML语言教程模板视图TemplatedView(一)
  10. iOS UIVisualEffectView毛玻璃亮度不符合要求