export interface DataModel<T> {
expire: number,
data: T
}
/**
* 使用存储钩子
* @param storage 存储引擎,默认 localStorage
* @param namespaced 命名空间
* @param separator 分隔符,默认英文冒号
*/
export function useStorageHook(namespaced: string = "", separator = ":", storage: Storage = localStorage) {
/**
* 创建包含命名空间的键
* @param key
*/
function createKey(key: string) {
return [namespaced, key].join(separator);
}
/**
* 设置值
* @param key
* @param value
* @param expire
*/
function setItem(key: string, value: any, expire: number = 0) {
let modal: DataModel<any> = {
expire: expire > 0 ? new Date().getTime() + expire * 1000 : 0,
data: value
}
storage.setItem(createKey(key), JSON.stringify(modal));
return modal;
}
/**
* 获取值
* @param key
* @param def
*/
function getItem<T>(key: string, def: any = null) {
let data: string | null = storage.getItem(createKey(key));
if (!data) return def;
let modal = JSON.parse(data) as DataModel<T>;
if (modal.expire !== 0 && modal.expire < new Date().getTime()) {
storage.removeItem(createKey(key));
return def;
}
return modal.data;
}
/**
* 移除值
* @param key
*/
function removeItem(key: string) {
storage.removeItem(createKey(key));
}
/**
* 清除值
*/
function clearItem() {
for (const key in storage) {
if (key.indexOf(namespaced) === 0) {
storage.removeItem(key);
}
}
}
return {
setItem,
getItem,
removeItem,
clearItem
}
}