最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

localStorage過期時間設(shè)置的幾種方法

 更新時間:2021年12月17日 15:37:34   作者:徐小夕  
聊到localStorage想必熟悉前端的朋友都不會陌生,在實際的應(yīng)用場景中,我們往往需要讓localStorage設(shè)置的某個key能在指定時間內(nèi)自動失效,所以基于這種場景,我們?nèi)绾稳ソ鉀Q呢,本文就詳細的介紹一下

聊到 localStorage 想必熟悉前端的朋友都不會陌生, 我們可以使用它提供的 getItem, setItem, removeItem, clear 這幾個 API 輕松的對存儲在瀏覽器本地的數(shù)據(jù)進行**「讀,寫, 刪」操作, 但是相比于 cookie, localStorage 唯一美中不足的就是「不能設(shè)置每一個鍵的過期時間」**。

localStorage 屬性允許我們訪問一個 Document 源(origin)的對象 Storage;存儲的數(shù)據(jù)將保存在瀏覽器會話中。 localStorage 類似 sessionStorage,但其區(qū)別在于:存儲在 localStorage 的數(shù)據(jù)可以長期保留;而當頁面會話結(jié)束——也就是說,當頁面被關(guān)閉時,存儲在 sessionStorage 的數(shù)據(jù)會被清除 。?

我們還應(yīng)注意,localStorage 中的鍵值對總是以字符串的形式存儲。

問題描述

在實際的應(yīng)用場景中, 我們往往需要讓 localStorage 設(shè)置的某個 「key」 能在指定時間內(nèi)自動失效, 所以基于這種場景, 我們?nèi)绾稳ソ鉀Q呢?

1. 初級解法

對于剛熟悉前端的朋友, 可能會立馬給出答案:

localStorage.setItem('dooring', '1.0.0')
// 設(shè)置一小時的有效期
const expire = 1000 * 60 * 60;
setTimeout(() => {
  localStorage.setItem('dooring', '')
}, expire)

當然這種方案能解決一時的問題, 但是如果要設(shè)置任意鍵的有效期, 使用這種方案就需要編寫多個定時器, 「維護成本極高, 且不利于工程化復用」。

2. 中級解法

前端工程師在有一定的工作經(jīng)驗之后, 往往會去考慮工程化和復用性的問題, 并對數(shù)據(jù)結(jié)構(gòu)有了一定的了解, 所以可能會有接下來的解法:

  • 用**「localStorage」**存一份{key(鍵): expire(過期時間)}的映射表
  • 重寫**「localStorage API」**, 對方法進行二次封裝

類似的代碼如下:

const store = {
  // 存儲過期時間映射
  setExpireMap: (key, expire) => {
    const expireMap = localStorage.getItem('EXPIRE_MAP') || "{}"
    localStorage.setItem(
      'EXPIRE_MAP', 
      JSON.stringify({
      ...JSON.parse(expireMap),
      key: expire
    }))
  },
  setItem: (key, value, expire) => {
    store.setExpireMap(key, expire)
    localStorage.setItem(key, value)
  },
  getItem: (key) => {
    // 在取值之前先判斷是否過期
    const expireMap = JSON.parse(
      localStorage.getItem('EXPIRE_MAP') || "{}"
    )
    if(expireMap[key] && expireMap[key] < Date.now()) {
      return localStorage.getItem(key)
    }else {
      localStorage.removeItem(key)
      return null
    }
  }
  // ...
}

眨眼一看這個方案確實解決了復用性的問題, 并且不同團隊都可以使用這個方案, 但仍然有一些缺點:

  • 對 store 操作時需要維護2份數(shù)據(jù), 并且占用緩存空間
  • 如果 EXPIRE_MAP 誤刪除將會導致所有過期時間失效
  • 對操作過程缺少更靈活的控制(比如操作狀態(tài), 操作回調(diào)等)

3. 高級解法

為了減少維護成本和空間占用, 并支持一定的靈活控制和容錯能力, 我們又應(yīng)該怎么做呢?
這里筆者想到了兩種類似的方案:

  1. 將過期時間存到 key 中, 如 dooring|6000, 每次取值時通過分隔符“|”來將 key 和 expire 取出, 進行判斷
  2. 將過期時間存到 value 中, 如 1.0.0|6000, 剩下的同1

為了更具有封裝性和可靠性, 我們還可以配置不同狀態(tài)下的回調(diào), 簡單實現(xiàn)如下:

const store = {
  preId: 'xi-',
  timeSign: '|-door-|',
  status: {
    SUCCESS: 0,
    FAILURE: 1,
    OVERFLOW: 2,
    TIMEOUT: 3,
  },
  storage: localStorage || window.localStorage,
  getKey: function (key: string) {
    return this.preId + key;
  },
  set: function (
    key: string,
    value: string | number,
    time?: Date & number,
    cb?: (status: number, key: string, value: string | number) => void,
  ) {
    let _status = this.status.SUCCESS,
      _key = this.getKey(key),
      _time;
    // 設(shè)置失效時間,未設(shè)置時間默認為一個月
    try {
      _time = time
        ? new Date(time).getTime() || time.getTime()
        : new Date().getTime() + 1000 * 60 * 60 * 24 * 31;
    } catch (e) {
      _time = new Date().getTime() + 1000 * 60 * 60 * 24 * 31;
    }
    try {
      this.storage.setItem(_key, _time + this.timeSign + value);
    } catch (e) {
      _status = this.status.OVERFLOW;
    }
    cb && cb.call(this, _status, _key, value);
  },
  get: function (
    key: string,
    cb?: (status: number, value: string | number | null) => void,
  ) {
    let status = this.status.SUCCESS,
      _key = this.getKey(key),
      value = null,
      timeSignLen = this.timeSign.length,
      that = this,
      index,
      time,
      result;
    try {
      value = that.storage.getItem(_key);
    } catch (e) {
      result = {
        status: that.status.FAILURE,
        value: null,
      };
      cb && cb.call(this, result.status, result.value);
      return result;
    }
    if (value) {
      index = value.indexOf(that.timeSign);
      time = +value.slice(0, index);
      if (time > new Date().getTime() || time == 0) {
        value = value.slice(index + timeSignLen);
      } else {
        (value = null), (status = that.status.TIMEOUT);
        that.remove(_key);
      }
    } else {
      status = that.status.FAILURE;
    }
    result = {
      status: status,
      value: value,
    };
    cb && cb.call(this, result.status, result.value);
    return result;
  },
  // ...
};

export default store;

這樣, 我們就實現(xiàn)了每個 key 都有獨立的過期時間, 并且對不同的操作結(jié)果可以輕松的進行狀態(tài)管控啦~

4. 骨灰級解法

當然, 骨灰級解法是直接使用 xijs 這個 javascript 工具庫, 因為我已經(jīng)將上述完整實現(xiàn)方案封裝到該庫中了, 我們只需要使用如下的方案, 就能輕松使用具有過期時間的強大的 「localStorage」 方法啦 :

//  先安裝 yarn add xijs
import { store } from 'xijs';
// 設(shè)置帶有過期時間的key
store.set('name', 'dooring', Date.now() + 1000);
console.log(store.get('name'));
setTimeout(() => {
  console.log(store.get('name'));
}, 1000);

// 設(shè)置成功后的回調(diào)
store.set('dooring', 'xuxiaoxi', Date.now() + 1000, (status, key, value) => {
  console.log('success');
});

同時 xijs 還在持續(xù)擴充更有用的工具函數(shù), 讓業(yè)務(wù)開發(fā)更高效. 目前已集成了如下工具函數(shù):

  • 「store」 基于 localStorage 上層封裝的支持過期時間設(shè)置的緩存庫, 支持操作回調(diào)
  • 「uuid」 生成唯一id, 支持設(shè)置長度
  • 「randomStr」 生成指定個數(shù)的隨機字符串
  • 「formatDate」 開箱即用的時間格式化工具
  • 「debounce」 防抖函數(shù)
  • 「throttle」 節(jié)流函數(shù)
  • 「url2obj」 將url字符串轉(zhuǎn)換為對象
  • 「obj2url」 將對象轉(zhuǎn)換成編碼后的url字符串
  • 「isPC」 判斷設(shè)備是否為PC類型

github地址: https://github.com/MrXujiang/xijs

文檔地址:h5.dooring.cn/xijs

到此這篇關(guān)于localStorage過期時間設(shè)置的幾種方法的文章就介紹到這了,更多相關(guān)localStorage 過期時間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS實現(xiàn)文本比較差異的示例代碼

    JS實現(xiàn)文本比較差異的示例代碼

    內(nèi)部系統(tǒng)上線了一個發(fā)版記錄發(fā)版內(nèi)容的功能,維護發(fā)版記錄的同事提出一個可以展示前后文本差異的優(yōu)化需求,?使的每次變更前可以確認新增了哪些,或者刪除了哪些內(nèi)容,所以本文給大家介紹了基于JS實現(xiàn)文本比較差異,需要的朋友可以參考下
    2023-12-12
  • JS實現(xiàn)間歇滾動的運動效果實例

    JS實現(xiàn)間歇滾動的運動效果實例

    這篇文章主要介紹了JS實現(xiàn)間歇滾動的運動效果,涉及javascript定時器觸發(fā)動態(tài)改變頁面元素的相關(guān)操作技巧,需要的朋友可以參考下
    2016-12-12
  • ES6新特性六:promise對象實例詳解

    ES6新特性六:promise對象實例詳解

    這篇文章主要介紹了ES6新特性之promise對象,結(jié)合實例形式詳細分析了promise對象的功能、狀態(tài)、使用方法與相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • webpack4 CSS Tree Shaking的使用

    webpack4 CSS Tree Shaking的使用

    這篇文章主要介紹了webpack4 CSS Tree Shaking的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • JS中浮點數(shù)精度問題的分析與解決方法

    JS中浮點數(shù)精度問題的分析與解決方法

    在js中我們有時會遇到計算,通過加減乘除處理某些業(yè)務(wù),那么這時候如果不做任何處理,就會出現(xiàn)如下典型的精度丟失問題,下面這篇文章主要給大家介紹了關(guān)于JS中浮點數(shù)精度問題的分析與解決方法,需要的朋友可以參考下
    2022-04-04
  • Json文件格式化方法詳解

    Json文件格式化方法詳解

    JSON 屬于文本,并且我們能夠把任何 JavaScript 對象轉(zhuǎn)換為 JSON,然后將 JSON 發(fā)送到服務(wù)器,這篇文章主要介紹了Json文件格式化方法,需要的朋友可以參考下
    2023-05-05
  • Javascript判斷文件是否存在(客戶端/服務(wù)器端)

    Javascript判斷文件是否存在(客戶端/服務(wù)器端)

    這篇文章主要介紹了Javascript判斷文件是否存在的方法適用于客戶端、服務(wù)器端,遠程文件,示例代碼如下,需要的朋友可以參考下
    2014-09-09
  • 將JSON字符串轉(zhuǎn)換成Map對象的方法

    將JSON字符串轉(zhuǎn)換成Map對象的方法

    下面小編就為大家?guī)硪黄獙SON字符串轉(zhuǎn)換成Map對象的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • javascript的replace方法結(jié)合正則使用實例總結(jié)

    javascript的replace方法結(jié)合正則使用實例總結(jié)

    這篇文章主要介紹了javascript的replace方法結(jié)合正則使用技巧,實例總結(jié)了replace方法配合正則表達式進行變量、分組、字符等替換技巧,需要的朋友可以參考下
    2016-06-06
  • JavaScript設(shè)置表單上傳時文件個數(shù)的方法

    JavaScript設(shè)置表單上傳時文件個數(shù)的方法

    這篇文章主要介紹了JavaScript設(shè)置表單上傳時文件個數(shù)的方法,可實現(xiàn)動態(tài)增加及刪除表單上傳按鈕的功能,非常簡單實用,需要的朋友可以參考下
    2015-08-08

最新評論

思茅市| 武汉市| 屏边| 蓝田县| 都安| 枣庄市| 贵定县| 宜昌市| 东乡| 南宁市| 观塘区| 闻喜县| 甘南县| 永丰县| 息烽县| 澳门| 景东| 太湖县| 馆陶县| 如东县| 西城区| 灵武市| 江北区| 武山县| 吐鲁番市| 蓝田县| 南部县| 炉霍县| 黄龙县| 永福县| 田东县| 宿松县| 富平县| 孝感市| 铜梁县| 昌图县| 闽清县| 昭平县| 临桂县| 英超| 承德市|