// storage.js
// 类型 window.localStorage, window.sessionStorage,const config = {type: 'sessionStorage', // 本地存储类型 localStorage sessionStorageprefix: 'project_1.0.0', // 名称前缀 建议:项目名 + 项目版本expire: 0, //过期时间 单位:秒};// 判断是否支持 Storageexport const isSupStorage = () => {if (!window) {throw new Error('当前环境非浏览器, 无法消费全局window实例。');}if (!window.localStorage) {throw new Error('当前环境非无法使用localStorage');}if (!window.sessionStorage) {throw new Error('当前环境非无法使用sessionStorage');}return typeof Storage !== 'undefined' ? true : false;};// 设置 setStorageexport const setStorage = (key, value, expire = 0) => {if (value === '' || value === null || value === undefined) {value = null;}if (isNaN(expire) || expire < 0) throw new Error('Expire must be a number');expire = (expire ? expire : config.expire) * 1000;let data = {value: value, // 存储值time: Date.now(), //存值时间戳expire: expire, // 过期时间};const encryptString = JSON.stringify(data);window[config.type].setItem(autoAddPrefix(key), encryptString);};// 获取 getStorageexport const getStorage = key => {let value = null;key = autoAddPrefix(key);// key 不存在判断if (!window[config.type].getItem(key) ||JSON.stringify(window[config.type].getItem(key)) === 'null') {return null;}// 优化 持续使用中续期const storage = JSON.parse(window[config.type].getItem(key));const nowTime = Date.now();// 过期删除if (storage.expire && storage.expire < nowTime - storage.time) {removeStorage(key);return null;} else {// // 未过期期间被调用 则自动续期 进行保活// setStorage(autoRemovePrefix(key), storage.value);if (isJson(storage.value)) {value = JSON.parse(storage.value);} else {value = storage.value;}return value;}};// 是否存在 hasStorageexport const hasStorage = key => {key = autoAddPrefix(key);let arr = getStorageAll().filter(item => {return item.key === key;});return arr.length ? true : false;};// 获取所有keyexport const getStorageKeys = () => {let items = getStorageAll();let keys = [];for (let index = 0; index < items.length; index++) {keys.push(items[index].key);}return keys;};// 根据索引获取keyexport const getStorageForIndex = index => {return window[config.type].key(index);};// 获取localStorage长度export const getStorageLength = () => {return window[config.type].length;};// 获取全部 getAllStorageexport const getStorageAll = () => {const len = getStorageLength(); // 获取长度let arr = []; // 定义数据集for (let i = 0; i < len; i++) {const key = window[config.type].key(i);// 获取key 索引从0开始const getKey = autoRemovePrefix(key);// 获取key对应的值const storage = JSON.parse(window[config.type].getItem(key));const nowTime = Date.now();if (storage.expire && nowTime - storage.time > storage.expire) {removeStorage(getKey);} else {let getVal = storage.value;// console.log(Object.prototype.toString.call(value));if (isJson(getVal)) {getVal = JSON.parse(getVal);}// 放进数组arr.push({ key: getKey, val: getVal });}}return arr;};// 删除 removeStorageexport const removeStorage = key => {// console.log(config.prefix, key);if (key.includes(config.prefix)) {window[config.type].removeItem(key);} else {window[config.type].removeItem(autoAddPrefix(key));}};// 清空 clearStorageexport const clearStorage = () => {window[config.type].clear();};// 判断是否可用 JSON.parseexport const isJson = value => {if (Object.prototype.toString.call(value) === '[object String]') {try {const obj = JSON.parse(value);const objType = Object.prototype.toString.call(obj);return objType === '[object Object]' || objType === '[object Array]';} catch (e) {// console.log('error:' + value + '!!!' + e);return false;}}return false;};// 名称前自动添加前缀const autoAddPrefix = key => {const prefix = config.prefix ? config.prefix + '_' : '';return prefix + key;};// 移除已添加的前缀const autoRemovePrefix = key => {const len = config.prefix ? config.prefix.length + 1 : '';return key.substr(len);};
// react 种使用
import React from 'react';
import { Button } from 'antd';
import {
setStorage,
getStorage,
removeStorage,
getStorageAll,
} from '@/utils/locaStorage';
export default function Test2() {
const setF = () => {
setStorage('name', '张1三', 10);
setStorage('age', '18', 10);
console.log('set:', getStorage('name'));
};
const getF = () => {
console.log('get:', getStorage('name'));
console.log('all storage:', getStorageAll());
};
const deleteF = () => {
removeStorage('name');
console.log('delete:', getStorage('name'));
};
return (
<div>
<Button onClick={setF}>设置缓存</Button>
<Button onClick={getF}>获取缓存</Button>
<Button onClick={deleteF}>删除缓存</Button>
</div>
);
}
