程序员IT平头哥联盟React.js

巧妙让localStorage也能设置过期

2018-11-26  本文已影响7人  苏南South
如何给localStorage设置一个有效期

引言

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

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

思考点

从我们接触前端起,第一个熟悉的存储相关的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(存入) 方法:


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(获取) 方法:

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;
}

优化点:


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,都适用,做些许调整即可哦,希望今天的分享能给您带来些许成长,如果觉得不错,记得关注下方公众号哦,每周第一时间为您推最新分享👇👇。

宝剑锋从磨砺出,梅花香自苦寒来,做有温度的攻城狮!,公众号:honeyBadger8

更多文章:

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

上一篇下一篇

猜你喜欢

热点阅读