// storage.js

    1. // 类型 window.localStorage, window.sessionStorage,
    2. const config = {
    3. type: 'sessionStorage', // 本地存储类型 localStorage sessionStorage
    4. prefix: 'project_1.0.0', // 名称前缀 建议:项目名 + 项目版本
    5. expire: 0, //过期时间 单位:秒
    6. };
    7. // 判断是否支持 Storage
    8. export const isSupStorage = () => {
    9. if (!window) {
    10. throw new Error('当前环境非浏览器, 无法消费全局window实例。');
    11. }
    12. if (!window.localStorage) {
    13. throw new Error('当前环境非无法使用localStorage');
    14. }
    15. if (!window.sessionStorage) {
    16. throw new Error('当前环境非无法使用sessionStorage');
    17. }
    18. return typeof Storage !== 'undefined' ? true : false;
    19. };
    20. // 设置 setStorage
    21. export const setStorage = (key, value, expire = 0) => {
    22. if (value === '' || value === null || value === undefined) {
    23. value = null;
    24. }
    25. if (isNaN(expire) || expire < 0) throw new Error('Expire must be a number');
    26. expire = (expire ? expire : config.expire) * 1000;
    27. let data = {
    28. value: value, // 存储值
    29. time: Date.now(), //存值时间戳
    30. expire: expire, // 过期时间
    31. };
    32. const encryptString = JSON.stringify(data);
    33. window[config.type].setItem(autoAddPrefix(key), encryptString);
    34. };
    35. // 获取 getStorage
    36. export const getStorage = key => {
    37. let value = null;
    38. key = autoAddPrefix(key);
    39. // key 不存在判断
    40. if (
    41. !window[config.type].getItem(key) ||
    42. JSON.stringify(window[config.type].getItem(key)) === 'null'
    43. ) {
    44. return null;
    45. }
    46. // 优化 持续使用中续期
    47. const storage = JSON.parse(window[config.type].getItem(key));
    48. const nowTime = Date.now();
    49. // 过期删除
    50. if (storage.expire && storage.expire < nowTime - storage.time) {
    51. removeStorage(key);
    52. return null;
    53. } else {
    54. // // 未过期期间被调用 则自动续期 进行保活
    55. // setStorage(autoRemovePrefix(key), storage.value);
    56. if (isJson(storage.value)) {
    57. value = JSON.parse(storage.value);
    58. } else {
    59. value = storage.value;
    60. }
    61. return value;
    62. }
    63. };
    64. // 是否存在 hasStorage
    65. export const hasStorage = key => {
    66. key = autoAddPrefix(key);
    67. let arr = getStorageAll().filter(item => {
    68. return item.key === key;
    69. });
    70. return arr.length ? true : false;
    71. };
    72. // 获取所有key
    73. export const getStorageKeys = () => {
    74. let items = getStorageAll();
    75. let keys = [];
    76. for (let index = 0; index < items.length; index++) {
    77. keys.push(items[index].key);
    78. }
    79. return keys;
    80. };
    81. // 根据索引获取key
    82. export const getStorageForIndex = index => {
    83. return window[config.type].key(index);
    84. };
    85. // 获取localStorage长度
    86. export const getStorageLength = () => {
    87. return window[config.type].length;
    88. };
    89. // 获取全部 getAllStorage
    90. export const getStorageAll = () => {
    91. const len = getStorageLength(); // 获取长度
    92. let arr = []; // 定义数据集
    93. for (let i = 0; i < len; i++) {
    94. const key = window[config.type].key(i);
    95. // 获取key 索引从0开始
    96. const getKey = autoRemovePrefix(key);
    97. // 获取key对应的值
    98. const storage = JSON.parse(window[config.type].getItem(key));
    99. const nowTime = Date.now();
    100. if (storage.expire && nowTime - storage.time > storage.expire) {
    101. removeStorage(getKey);
    102. } else {
    103. let getVal = storage.value;
    104. // console.log(Object.prototype.toString.call(value));
    105. if (isJson(getVal)) {
    106. getVal = JSON.parse(getVal);
    107. }
    108. // 放进数组
    109. arr.push({ key: getKey, val: getVal });
    110. }
    111. }
    112. return arr;
    113. };
    114. // 删除 removeStorage
    115. export const removeStorage = key => {
    116. // console.log(config.prefix, key);
    117. if (key.includes(config.prefix)) {
    118. window[config.type].removeItem(key);
    119. } else {
    120. window[config.type].removeItem(autoAddPrefix(key));
    121. }
    122. };
    123. // 清空 clearStorage
    124. export const clearStorage = () => {
    125. window[config.type].clear();
    126. };
    127. // 判断是否可用 JSON.parse
    128. export const isJson = value => {
    129. if (Object.prototype.toString.call(value) === '[object String]') {
    130. try {
    131. const obj = JSON.parse(value);
    132. const objType = Object.prototype.toString.call(obj);
    133. return objType === '[object Object]' || objType === '[object Array]';
    134. } catch (e) {
    135. // console.log('error:' + value + '!!!' + e);
    136. return false;
    137. }
    138. }
    139. return false;
    140. };
    141. // 名称前自动添加前缀
    142. const autoAddPrefix = key => {
    143. const prefix = config.prefix ? config.prefix + '_' : '';
    144. return prefix + key;
    145. };
    146. // 移除已添加的前缀
    147. const autoRemovePrefix = key => {
    148. const len = config.prefix ? config.prefix.length + 1 : '';
    149. return key.substr(len);
    150. };

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