本地存储封装(版本一)
- 最近学习pinia,然后再一次遇到了本地存储的相关问题。
- 然后就心血来潮,封装了一个感觉还可以的封装函数。
- 同时欢迎大家指出我的不足,我会汲取意见不断改进进步。
- 使用ts封装,可以使用Symbol替代enmu
import { checkDataType, checkEmpty } from './utils'
const enum Storages { cookie, local ,session }
function setStorage (type:Storages, key:string, value:any, indite?:number|boolean, merge?:boolean) {
let text:string;
switch (checkDataType(value)) {
case '[object Object]':
case '[object Array]':
let oldVal = getStorage(type, key)
if (merge || indite === true && checkEmpty(merge) && checkDataType(oldVal, 'object')) {
for (let key in value) {
if (checkEmpty(value[key], true)) {
delete value[key];
delete oldVal[key];
}
}
text = JSON.stringify({ ...oldVal, ...value });
} else {
text = JSON.stringify(value);
}
break;
default: text = value;
}
switch(type) {
case Storages.cookie:
if (checkDataType(indite, 'number')) {
let date = new Date();
date.setTime(date.getTime() - 8 * 60 * 60 * 1000 + (indite as number) * 1000);
document.cookie = key + "=" + text + ";expires=" + date;
} else {
document.cookie= key + "=" + text;
}
break;
case Storages.local:
localStorage.setItem(key, text);
break;
case Storages.session:
sessionStorage.setItem(key, text);
break;
}
}
function getStorage (type:Storages ,key:string, valueKey?:string):any {
let value = "";
switch(type) {
case Storages.cookie:
const cookieArr = document.cookie.split(";");
cookieArr.forEach(item => {
if (item.split("=")[0].trim() === key) {
value = item.split("=")[1].trim();
}
});
break;
case Storages.local:
if(localStorage.getItem(key)) value = (localStorage.getItem(key) as string);
break;
case Storages.session:
if(sessionStorage.getItem(key)) value = (sessionStorage.getItem(key) as string);
break;
}
try {
let callbackObj = JSON.parse(value);
if (valueKey && callbackObj[valueKey]) return callbackObj[valueKey];
return callbackObj;
} catch {
return value;
}
};
function delStorage (type:Storages, key:string) {
switch(type) {
case Storages.cookie:
break;
case Storages.local:
localStorage.removeItem(key)
break;
case Storages.session:
sessionStorage.removeItem(key)
break;
}
};
export function setCookie(key:string, value:any, indite?:number|boolean, merge?:boolean):void {
setStorage(Storages.cookie, key, value, indite, merge)
}
export function getCookie(key:string, valueKey?:string) {
return getStorage(Storages.cookie, key, valueKey)
}
export function delCookie(key:string) {
delStorage(Storages.cookie, key)
}
export function setLocal(key:string, value:any, merge?:number|boolean) {
setStorage(Storages.local, key, value, merge)
}
export function getLocal(key:string, valueKey?:string) {
return getStorage(Storages.local, key, valueKey)
}
export function delLocal(key:string) {
delStorage(Storages.local, key)
}
export function setSession(key:string, value:any, merge?:number|boolean) {
setStorage(Storages.session, key, value, merge)
}
export function getSession(key:string, valueKey?:string) {
return getStorage(Storages.session, key, valueKey)
}
export function delSession(key:string) {
delStorage(Storages.session, key)
}