storage

116 阅读1分钟

storage


/**
 * @description: 统一封装localStorage,防止乱用localStorage,集中管理localStorage
 * **/
class Storage {
  constructor(options = {}) {
    if (Object.prototype.toString.call(options) !== '[object Object]') {
      throw new Error('options is not an object');
    }
    this.options = options
  }

  set(key, value, expires) {
    const createTime = Date.now()
    const keyLabel = this.options.key
    let data = window.localStorage.getItem(keyLabel)
    data = JSON.parse(data) || {}

    data[key] =  { createTime, expires, data: value }

    window.localStorage.setItem(keyLabel, JSON.stringify(data))
  }

  get(key, createTime) {
    createTime = createTime || Date.now()
    const keyLabel = this.options.key
    let data = window.localStorage.getItem(keyLabel)
    data = JSON.parse(data) || {}

    const value = data[key] || {}

    if (value.expires && createTime - value.createTime > value.expires) {
      return null
    }

    return value.data
  }

  remove(keyList = []) {
    if (!Array.isArray(keyList)) {
      throw new Error('keyList must be an array')
    }

    const len = keyList.length
    const keyLabel = this.options.key

    if (len === 0) {
      window.localStorage.removeItem(keyLabel)
    } else {
      let data = window.localStorage.getItem(keyLabel)
      data = JSON.parse(data) || {}

      keyList.forEach(item => {
        delete data[item]
      })

      window.localStorage.setItem(keyLabel, JSON.stringify(data))
    }
  }

  clear() {
    this.remove()
  }
}


const storage = (options = {}) => {
  const storage = new Storage(options)
  return storage
}

const storage3PL = storage({
  key: '3pl'
})

export {
  storage,
  storage3PL
}


use

storage3PL.set('name', '李四')
storage3PL.set('name', '李四', 2 * 60 * 60 * 1000) // 设置缓存2小时

storage3PL.get('name')
storage3PL.get('name', new Date()) // 手动指定过期时间
storage3PL.reomve('name')
storage3PL.clear()