这个话题其实在上次分享<小程序填坑记里讲过了>已经讲过(大佬可绕过哦~
),但后来群里/评论都有些同窗,提到了一些疑问,问可否单独整理一篇更为详细的分享,讲解一下细节和完善提到的不足,如是有了下文👇。 —— 「 用心分享 作有温度的攻城狮,我是首席填坑官
——苏南 」javascript
各位大佬早安,这里是 @IT·平头哥联盟,我是 首席填坑官∙苏南,用心分享 作有温度的攻城狮。
公众号:honeyBadger8
,群:912594095
从咱们接触前端起,第一个熟悉的存储相关的Cookie或者来分析咱们生活中密切相关的淘宝、物流、闹钟等事物来讲起吧,前端
订单结束
);以上种种,咱们能得出一个结论任何一件事、一个行为动做,都有一个时间、一个节点,甚至咱们能够黑localStorage
,就是一个完善的API,为何不能给一个设置过时的机制,由于sessionStorage
、Cookie
并不能知足咱们实际的需求。
抱歉,黑localStorage
不完善,有点夸张了,综合上述的总结,问题就简单了,给localStorage
一个过时时间,一切就都so easy ?究竟是不是,来看看具体的实现吧:java
//示例一: localStorage.setItem('test',1234567); let test = localStorage.getItem('test'); console.log(typeof test, test); //示例二: localStorage['name'] = '苏南'; console.log(localStorage['name']); /* 输出: "1234567" ,'苏南', 这里要注意,1234567 存进去时是number 取出来就成string了 */
JSON.stringify
,set(key, value, expired) { /* * set 存储方法 * @ param {String} key 键 * @ param {String} value 值, * @ param {String} expired 过时时间,以分钟为单位,非必须 * @ 由@IT·平头哥联盟-首席填坑官∙苏南 分享,交流:912594095 */ let source = this.source; source[key] = JSON.stringify(value); if (expired){ source[`${key}__expires__`] = Date.now() + 1000*60*expired }; return value; }
expired
为非必须参数,因此默认为当前时间+1,即长期有效;JSON.parse
,get(key) { /* * get 获取方法 * @ param {String} key 键 * @ param {String} expired 存储时为非必须字段,因此有可能取不到,默认为 Date.now+1 * @ 由@IT·平头哥联盟-首席填坑官∙苏南 分享,交流:912594095 */ 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(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·平头哥联盟-首席填坑官∙苏南 分享,交流:912594095 */ 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,都适用,作些许调整便可哦,但愿今天的分享能给您带来些许成长,若是以为不错,记得关注下方公众号哦,每周第一时间为您推最新分享👇👇。git
做者:苏南 - 首席填坑官
连接: https://blog.csdn.net/weixin_...
交流:912594095
,公众号:honeyBadger8
本文原创,著做权归做者全部。商业转载请联系@IT·平头哥联盟
得到受权,非商业转载请注明原连接及出处。