localStorage二次封装设置过期时间

150 阅读1分钟

菜鸡笔记

记录一下自己瞎弄的localStorage二次封装设置过期时间,直接上代码

目录

image.png

使用

给token设置3秒后过期

image.png

image.png

image.png

代码

// index.js
import { lStorage } from './lStorage'

// 二次封装localStorage,支持设置过期时间,规范key唯一
export function storage () {
    return {
        lStorage
    }
}
// lStorageConfig.js
export const lStorageConfig = {
  state: {
    name: 'happy-', // 系统前缀
    expireTimeList: 'EXPIRE-TIME-LIST', // ls过期时间合集
    time: 86400, // 单位秒,默认一天
  },
  // 需要配置key才能setls
  keys: {
    token: 'token',
    name: 'name',
    password: 'password',
  }
}
// lStorage.js
import { lStorageConfig } from './lStorageConfig'

export const lStorage = {
  /**
   * 设置过期时间
   * @param {*} key key值
   * @param {*} sec 秒
   */
  setExpireTime(keyName, sec){
    const now = Date.now(); // 获取当前时间的毫秒数
    const oneMinuteLater = now + (sec * 1000); // 计算x秒后的时间的毫秒数
    const setExpireTimeName = lStorageConfig.state.name + lStorageConfig.state.expireTimeList // 设置过期时间的键名合集ls键名
    const expireMap = JSON.parse(localStorage.getItem(setExpireTimeName)) || {}// 获取过期时间的键名合集
    // 新增的值
    let obj = {
      [keyName]: oneMinuteLater
    }
    const newExpireMap = Object.assign({}, expireMap, obj)
    localStorage.setItem(setExpireTimeName, JSON.stringify(newExpireMap))
  },
  /**
   * 删除过期时间的键名合集已过期的key
   * @param {*} keyName key名
   * @param {*} sec 秒
   */
  delExpireTime(keyName, sec){
    const setExpireTimeName = lStorageConfig.state.name + lStorageConfig.state.expireTimeList // 设置过期时间的键名合集ls键名
    const expireMap = JSON.parse(localStorage.getItem(setExpireTimeName)) || {} // 获取过期时间的键名合集
    const newExpireMap = Object.assign({}, expireMap)
    delete newExpireMap[keyName]
    localStorage.setItem(setExpireTimeName, JSON.stringify(newExpireMap))
  },
  /**
   * 设置ls数据
   * @param {*} key key值
   * @param {*} value value值
   * @param {*} sec 单位秒
   * @returns 
   */
  setItem(key, value, sec = lStorageConfig.state.time){
    if(!Object.prototype.hasOwnProperty.call(lStorageConfig.keys, key)) return console.log('请先配置唯一key: ' + key) // 必须在lStorageConfig先配置
    const keyName = lStorageConfig.state.name + key
    localStorage.setItem(keyName, value) // 设置ls
    lStorage.setExpireTime(keyName, sec) // 设置过期时间
  },

  /**
   * 获取ls数据
   * @param {*} key key值
   * @returns 
   */
  getItem(key){
    const keyName = lStorageConfig.state.name + key
    const setExpireTimeName = lStorageConfig.state.name + lStorageConfig.state.expireTimeList // 设置过期时间的键名合集
    const expireMap = JSON.parse(localStorage.getItem(setExpireTimeName)) || {}
    // 判断时间是否已过期
    if(expireMap[keyName] && expireMap[keyName] > Date.now()) {
      return localStorage.getItem(keyName) // 返回对应ls数据
    } else {
      localStorage.removeItem(keyName) // 删除ls
      lStorage.delExpireTime(keyName) // 删除设置过期时间合集的对应键名
      // console.log(keyName + '已过期')
      return null
    }
  }
}