JavaScript常用技巧:stroage封装

本地存储的封装

const TWO_DAY_MIN = 60 * 60 * 24 * 2

interface IConfig {
  type: 'localStorage' | 'sessionStorage'
  prefix: string
  expire: number
  isEncrypt: boolean
}

const config: IConfig = {
  type: 'localStorage', // 本地存储类型 localStorage/sessionStorage
  prefix: 'atp_1.0', // 名称前缀 建议:项目名 + 项目版本
  expire: TWO_DAY_MIN, //过期时间 单位:秒
  isEncrypt: true // 默认加密 为了调试方便, 开发过程中可以不加密
}

// 名称前自动添加前缀
const autoAddPrefix = (key: string): string => {
  const prefix = config.prefix ? config.prefix + '_' : ''
  return prefix + key
}

// 设置 setStorage
export const setStorage = (key: string, value: unknown, expire = TWO_DAY_MIN) => {
  const prefixKey = autoAddPrefix(key)
  if (value === '' || value === null || value === undefined) {
    value = null
  }

  if (isNaN(expire) || expire < 1) {
    throw new Error('Expire must be a number')
  }

  expire = (expire ? expire : config.expire) * 60000

  const data = {
    value: value, // 存储值
    time: Date.now(), //存值时间戳
    expire: expire // 过期时间
  }

  window[config.type].setItem(prefixKey, JSON.stringify(data))
}

// 删除 removeStorage
export const removeStorage = (key: string) => {
  const prefixKey = autoAddPrefix(key)
  window[config.type].removeItem(prefixKey)
}

// 获取 getStorage
export const getStorage = (key: string) => {
  const prefixKey = autoAddPrefix(key)

  // key 不存在判断
  if (!window[config.type].getItem(prefixKey) || JSON.stringify(window[config.type].getItem(prefixKey)) === 'null') {
    return null
  }

  // 优化 持续使用中续期
  const storage = JSON.parse(window[config.type].getItem(prefixKey))
  console.log(storage)
  const nowTime = Date.now()
  console.log(config.expire * 6000, nowTime - storage.time)
  // 过期删除
  if (storage.expire && config.expire * 6000 < nowTime - storage.time) {
    removeStorage(prefixKey)
    return null
  } else {
    // 未过期期间被调用 则自动续期 进行保活
    setStorage(key, storage.value)
    return storage.value
  }
}

// 获取全部 getAllStorage
export const getAllStorage = () => {
  const len = window[config.type].length // 获取长度
  const arr = [] // 定义数据集
  for (let i = 0; i < len; i++) {
    // 获取key 索引从0开始
    const getKey: string | null = window[config.type].key(i)
    // 获取key对应的值
    const getVal = window[config.type].getItem(getKey)
    // 放进数组
    arr[i] = { key: getKey, val: getVal }
  }
  return arr
}

// 清空 clearStorage
export const clearStorage = () => {
  window[config.type].clear()
}

export default {
  get: getStorage,
  set: setStorage,
  remove: removeStorage,
  getAll: getAllStorage,
  clear: clearStorage
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易风有点疯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值