一个自用的 Local,session,cookie 三合一封装

692 阅读9分钟

封装一个具有操作local,session,cookie的类(可批量操作)

首先我们看下三个方法的基本操作

  • localStorage:本地储存,具有长期有效的特征,浏览器关闭也不清空数据
class Storage {
    // constructor(options) { }
    constructor() {
            console.log('constructor')
        }
        // 获取_key的数据 => { data, keyInfo }
    _getData(_key) {
            console.log('调用了get')
          let _keys = Array.isArray(_key) ? _key : [_key]
            _keys.forEach(() => {
                return JSON.parse(localStorage.getItem())
            });
        }
        //移除操作
    _remove(_key) {
            let _keys = Array.isArray(_key) ? _key : [_key]
            const _data = _keys.forEach(() => {
                localStorage.removeItem();
            });
        }
        //设置操作
     set(key, data, options = {}) {
            console.log('调用了set')
            const _key = this._getKey(key);
            const _data = JSON.stringify(data, options);
            localStorage.setItem(_key, _data);
        }
        // 是否有效期内
    _isExpired(_key) {
        const { keyInfo } = this._getData(_key);
        const { expires, timestamp } = keyInfo;
        if (!expires) {
            return true;
        }
        return (
            timestamp + expires * 24 * 3600 * 1000 - new Date().getTime() < 0
        );
    }

}

小结:我们先来逐一看看我们做了什么,首先是get操作,我们将传进的数据先判断是否为数组,不是数组就转换为数组,然后用forEach将数组的元素逐一通过localStorage.getItem()进行获取,最后再将获取到的数据通过JSON.parse()进行数据格式转换,移除操作同样判断是否为数组,然后进行逐一移除,设置操作是键值对的形式进行的,最后一个判断是否过期, 用存放时间和定时时间和当前时间做比较,小于就是过期

  • Session:短期储存,在浏览器关闭以后数据就会被删除
class Session {
    get(key) {
        let keys = Array.isArray(key) ? key : [key]
        keys.forEach((r) => {
            return JSON.parse(sessionStorage.getItem[r])
        });
    }
    set(key, value) {
            var data = {
                value: value
            }
            sessionStorage.setItem[key] = JSON.stringify(data);
        }
        // 删除
    remove(key) {
            let keys = Array.isArray(key) ? key : [key]
            keys.forEach((r) => {
                return JSON.parse(sessionStorage.removeItem[r])
            });
        }
        // 清除全部
    clear() {
        sessionStorage.clear();
    }
}

小结:和local有异曲同工之妙

  • Cookie: 存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值
class Cookie {
    setCookie(name, value, n) {
        var oDate = new Date();
        oDate.setDate(oDate.getDate() + n);
        document.cookie = name + "=" + value + ";expires=" + oDate;
    }
    getCookie(name) {
        var str = document.cookie;
        var arr = str.split("; ");
        for (var i = 0; i < arr.length; i++) {
            //console.log(arr[i]);
            var newArr = arr[i].split("=");
            if (newArr[0] == name) {
                return newArr[1];
            }
        }
    }
    removeCookie(name) {
        this.setCookie(name, 1, -1);
    }
}

小结:这是一个常规的cookie操作类,实际使用中得根据需求进行调整,设置是一个键值对加上时间的字符串拼接,获取时候,要去除其中的特殊符号,移除较为简单

三合一

class Storage {
    // constructor(options) { }
    constructor() {
            console.log('constructor')
        }
        // 获取_key的数据 => { data, keyInfo }
    _getData(_key) {
            console.log('调用了get')
            let _keys = Array.isArray(_key) ? _key : [_key]
            _keys.forEach(() => {
                return JSON.parse(localStorage.getItem())
            });
        }
        //移除操作
    _remove(_key) {
            let _keys = Array.isArray(_key) ? _key : [_key]
            _keys.forEach(() => {
                localStorage.removeItem();
            });
        }
        //设置操作
    set(key, data, options = {}) {
            console.log('调用了set')
            const _key = this._getKey(key);
            const _data = JSON.stringify(data, options);
            localStorage.setItem(_key, _data);
        }
        // 是否有效期内
    _isExpired(_key) {
        const { keyInfo } = this._getData(_key);
        const { expires, timestamp } = keyInfo;
        if (!expires) {
            return true;
        }
        return (
            timestamp + expires * 24 * 3600 * 1000 - new Date().getTime() < 0
        );
    }

}
class Cookie {
    setCookie(name, value, n) {
        var oDate = new Date();
        oDate.setDate(oDate.getDate() + n);
        document.cookie = name + "=" + value + ";expires=" + oDate;
    }
    getCookie(name) {
        var str = document.cookie;
        var arr = str.split("; ");
        for (var i = 0; i < arr.length; i++) {
            //console.log(arr[i]);
            var newArr = arr[i].split("=");
            if (newArr[0] == name) {
                return newArr[1];
            }
        }
    }
    removeCookie(name) {
        this.setCookie(name, 1, -1);
    }
}
class Session {
    get(key) {
        let keys = Array.isArray(key) ? key : [key]
        keys.forEach((r) => {
            return JSON.parse(sessionStorage[r])
        });
    }
    set(key, value) {
            var data = {
                value: value
            }
            sessionStorage[key] = JSON.stringify(data);
        }
        // 删除
    remove(key) {
            let keys = Array.isArray(key) ? key : [key]
            keys.forEach((r) => {
                return JSON.parse(sessionStorage.removeItem[r])
            });
        }
        // 清除全部
    clear() {
        sessionStorage.clear();
    }
}
export { StorageCookieSession };

小结,这里把他们放进一个文件中,然后把他们类名暴露出去,我们再看看如何使用

  const local = new _Storage()
  local.set("name", { name: "SuperIron" }, { expires: 1 });
  const Info = local.get('name')

首先我们先将类实例化,然后按照预留的插槽传参