微信小程序 - 本地存儲 增加有效期

? ? ? ? 小程序的本地存儲API提供了wx.setStorageSync和wx.setStorage來存儲數據,注意的是,小程序的本地存儲并沒有明確的有效期設置,存儲的數據在不超過限制的情況下,會一直保留。

一、小程序本地存儲API

? ? ? ? 小程序的本地存儲API提供了設置存儲的鍵值,代碼如下:

const logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)

? ? ? ? 本地存儲如下圖:

? ? ? ? 上圖可見,小程序提供的本地存儲API沒有明確設置有效期的功能。為了解決這個問題,我們需要在存儲數據時附加一個expiration字段,用于記錄數據的過期時間,在獲取數據時,檢查當前時間是否超過了expiration指定的時間,如果超過則認為數據已失效。

? ? ? ? 由于此方法不是由小程序API直接支持的功能,而是通過檢查數據的有效性來模擬有效期行為,小程序本地存儲不會自動檢查刪除過期數據,需要在使用數據時檢查數據的有效性。

二、創建Storage類

? ? ? ? 在項目中創建一個storage.js文件,用于定義LocalStorage類,對小程序本地存儲API提供的wx.setStorageSync進行封裝,增加數據保存有效期的限定,這里將其定義在utils目錄中,代碼如下:

class LocalStorage {constructor(){this.timeRange = 1;   //默認情況下為1小時}// 保存數據setStorageSync(key, value){}// 獲取對應key值數據getStorageSync(key){}
}

三、獲取過期時間戳

? ? ? ? 在storage.js文件中,定義getStamptime()方法,用于獲取過期的時間戳。這里設置的時間范圍是通過小時為單位,代碼如下:

// 獲取時效性 - 時間戳
const getStamptime = hour => {const date = new Date();// 增加對應小時date.setHours(date.getHours() + hour);// 返回增加對應小時數后的時間戳return date.getTime();
}

四、檢查數據是否過期

? ? ? ? 在storage.js文件中,定義checkTimeRange()方法,用于鑒定獲取數據是否過期。如果數據過期則返回null,未過期則返回具體數據。代碼如下:

// 檢查數據是否過期
const checkTimeRange = data => {const time = new Date().getTime();// 如果當前時間超過 限定的有效期時間,則視為無效數據,返回nullreturn data.expiration < time ? null : data.value;
}

五、封裝小程序本地存儲API

? ? ? ? 這里將小程序本地存儲wx.setStorageSync進行封裝,在保存數據時,通過getStamptime()方法設置其有效期;在獲取數據時,通過checkTimeRange()方法判斷數據是否過期,并返回對應值。

class LocalStorage {constructor(){this.timeRange = 1;   //默認情況下為1小時}// 保存數據setStorageSync(key, value){wx.setStorageSync(key, { value,  expiration: getStamptime(this.timeRange) } )}// 獲取對應key值數據getStorageSync(key){return checkTimeRange( wx.getStorageSync(key) );}
}

六、完整代碼

? ? ? ? 封裝后的storage.js文件完整代碼如下:

// 檢查數據是否過期
const checkTimeRange = data => {const time = new Date().getTime();// 如果當前時間超過 限定的有效期時間,則視為無效數據,返回nullreturn data.expiration < time ? null : data.value;
}// 獲取時效性 - 時間戳
const getStamptime = hour => {const date = new Date();// 增加對應小時date.setHours(date.getHours() + hour);// 返回增加對應小時數后的時間戳return date.getTime();
}class LocalStorage {constructor(){this.timeRange = 1;   //默認情況下為1小時}// 保存數據setStorageSync(key, value){wx.setStorageSync(key, { value,  expiration: getStamptime(this.timeRange) } )}// 獲取對應key值數據getStorageSync(key){return checkTimeRange( wx.getStorageSync(key) );}
}
export default new LocalStorage();

七、示例

? ? ? ? 這里通過一個簡單示例,展示如何設置有效期為1小時的本地存儲。首先將storage.js引入到app.js中,代碼如下:

// app.js
import LocalStorage from './utils/storage'
App({onLaunch() {// 展示本地存儲能力const logs = wx.getStorageSync('logs') || []logs.unshift(Date.now())wx.setStorageSync('logs', logs)// 展示有效期本地存儲, 在有效期內只存儲一次let time_logs = LocalStorage.getStorageSync('time_logs');if(!time_logs){time_logs = [Date.now()];LocalStorage.setStorageSync('time_logs', time_logs);}},globalData: {userInfo: null}
})

? ? ? ? 本地存儲效果如下圖:

? ? ? ? 重新刷新頁面后,小程序提供的本地存儲會繼續追加數據,而增加了有效期的本地存儲則在時效內不會繼續執行,依然是一份數據。代碼如下:

八、修改時效性

? ? ? ? 當然,時效性范圍是可以被修改的,所以這里要對兩種場景增加有效期范圍的修改。

  1. 首先是增加setTimeRange()方法,用于統一修改全局有效期范圍;
  2. 對setStorageSync()方法增加有效期范圍設定,用于某些特定場景需要單獨設置數據的有效期范圍。

? ? ? ? 另外,設置有效期范圍值時,還需對其進行合法性校驗后,方可賦值使用。

class LocalStorage {constructor(){this.timeRange = 1;   //默認情況下為1小時}// 檢查有效期范圍值是否合法,不合法默認為全局的有效期verifyTime(){return 'number'!==typeof value || value <= 0 ? this.timeRange : value;}// 修改時效范圍setTimeRange(value){this.timeRange = this.verifyTime(value);}// 保存數據setStorageSync(key, value, expiration){wx.setStorageSync(key, { value,  expiration: getStamptime( 'undefined'!==typeof expiration ? this.verifyTime(expiration) : this.timeRange ) } )}// 獲取對應key值數據getStorageSync(key){return checkTimeRange( wx.getStorageSync(key) );}
}

九、定義為全局變量

? ? ? ? 有些人可能覺得每次使用時,要單獨引用會比較麻煩,這里可以將新封裝的本地存儲對象,綁定到wx全局對象中,就可代碼如下:

// app.js
import LocalStorage from './utils/storage'
wx.$storage = LocalStorage;
App({onLaunch() {// 展示本地存儲能力const logs = wx.getStorageSync('logs') || []logs.unshift(Date.now())wx.setStorageSync('logs', logs)let time_logs = wx.$storage.getStorageSync('time_logs');if(!time_logs){time_logs = [Date.now()];wx.$storage.setStorageSync('time_logs', time_logs);}},globalData: {userInfo: null}
})

? ? ? ? 所以,在小程序中,提供的本地存儲沒有明確的有效期設置,我們可以通過模擬有效期行為來實現這一功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42395.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42395.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42395.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WEB06JavaScriptAjax

基礎語法 引入方式 引入方式 內部腳本&#xff1a;將JS代碼定義在HTML頁面中 JavaScript代碼必須位于<script></script>標簽之間 在HTML文檔中&#xff0c;可以在任意地方&#xff0c;放置任意數量的<script> 一般會把腳本置于<body>元素的底部&a…

常見的氣體流量計有哪些?

1.氣體渦輪流量計 適用場合&#xff1a;流量變化小&#xff0c;脈動流頻率小&#xff0c;中低壓潔凈天然氣優點 1.精度高&#xff0c;重復性好 2.測量范圍廣&#xff0c;壓損小&#xff0c;安裝維修方便 3.具有較高的抗電磁干擾和抗震動能力缺點&#xff1a;分辨率低&#xff…

活動:不要卷模型,要卷應用

如何理解李彥宏說的“不要卷模型&#xff0c;要卷應用” 1. 現狀 現如今&#xff0c;是否具備獨立的 AI 技術似乎已經成為衡量一個互聯網企業是否成功的標志。各家都在竭盡全力卷模型、卷數據、卷訓練效果&#xff0c;市面上僅是語言類 AI 就多達十幾種&#xff0c;但從一名消…

瀏覽器中js外掛腳本的執行方式

1、開發工具控制臺交互執行 網頁中按F12打開開發者工具&#xff0c;選擇“控制臺”&#xff0c;鍵入js腳本命令回車執行&#xff0c;適用于臨時使用腳本邏輯簡單的場景&#xff0c;實例如下&#xff1a; // 獲取網頁元素的文本腳本 var elem document.getElementById("…

2-添加庫

本節將學習如何在項目中創建和使用庫&#xff0c;還將看到如何使庫的使用成為可選的。 本節中使用的示例代碼下載見step1-簡單開始cmake實踐-CSDN博客。 練習1 -創建一個庫 要在CMake中添加一個庫&#xff0c;使用add_library()命令并指定哪些源文件應該組成該庫。 我們可…

接入應用內支付服務,提高商業變現效率

在當今競爭激烈的移動應用市場中&#xff0c;開發者們面臨著提升應用商業變現能力的挑戰。用戶體驗的流暢性和支付的安全性至關重要。 HarmonyOS SDK應用內支付服務&#xff08;IAP Kit&#xff09;為開發者提供了一站式的解決方案&#xff0c;簡化了應用內支付的接入流程&…

C嘎嘎:類和對象(一)

目錄 面向過程和面向對象的初步認識 類的引入 類的定義 類的訪問限定符及封裝 訪問限定符 封裝 類的作用域 類的實例化 類對象模型 如何計算類對象大小 結構體內存對齊規則 this指針 this指針的引出 this指針的特性 類的6個默認成員函數 構造函數 概念 特性 …

喜訊丨美格智能通過國際EcoVadis平臺認證企業社會責任并榮獲承諾獎章,彰顯可持續發展實力

作為全球領先的無線通信模組及解決方案提供商&#xff0c;美格智能在社會責任領域再創新高。近日&#xff0c;美格智能憑借在企業社會責任和可持續性采購發展方面的卓越表現&#xff0c;通過國際在線權威評價機構EcoVadis對公司環境、勞工與人權、商業道德、可持續采購等方面審…

根據空格、制表符、回車符等分割字符串re.split

【小白從小學Python、C、Java】 【考研初試復試畢業設計】 【Python基礎AI數據分析】 根據空格、制表符、 回車符等分割字符串 re.split [太陽]選擇題 根據給定的Python代碼&#xff0c;哪個選項是正確的&#xff1f; import re pattern r\s print(f"【顯示】pattern{…

高清圖片壓縮無水印小程序源碼系統 前后端分離 帶完整的安裝代碼包以及搭建教程

系統概述 在當今的數字化時代&#xff0c;圖片作為信息傳播的重要載體&#xff0c;其質量和傳輸效率直接影響到用戶體驗。然而&#xff0c;高清圖片往往伴隨著較大的文件體積&#xff0c;這不僅會占用大量存儲空間&#xff0c;還會拖慢網頁或應用的加載速度。因此&#xff0c;…

熱烈祝賀!全視通多家客戶上榜全球自然指數TOP100!

2024年6月18日&#xff0c;全球醫療機構自然指數TOP100榜單發布&#xff0c;中國醫療機構在其中的表現尤為引人注目。 根據《自然》雜志網站發布的數據&#xff0c;此次公布的排名是基于&#xff08;2023年3月1日至2024年2月29日&#xff09;的統計數據&#xff0c;全球醫療機構…

Python在網絡爬蟲和數據抓取中的應用

Python在網絡爬蟲和數據抓取中的應用 引言 在數字化時代&#xff0c;數據的價值日益凸顯。無論是市場趨勢分析&#xff0c;還是個人偏好預測&#xff0c;數據都扮演著至關重要的角色。Python&#xff0c;作為一種功能強大、語法簡潔的編程語言&#xff0c;為數據的獲取、處理…

旗晟機器人AI智能算法有哪些?

在當今迅猛發展的工業4.0時代&#xff0c;智能制造和自動化運維已然成為工業發展至關重要的核心驅動力。伴隨技術的持續進步&#xff0c;工業場景中的運維巡檢已不再單純地依賴于傳統的人工運維方式&#xff0c;而是愈發多地融入了智能化的元素&#xff0c;其中智能巡檢運維系統…

前端Din字體和造字工房力黑字體文件

Din 字體是一種經典的、簡潔的無襯線字體&#xff0c;它源自1930年代的德國交通標志設計。 造字工房力黑字體適用于數字&#xff0c;駕駛艙標題等統計界面 DIN-Medium.otf 案例 造字工房力黑.TTF 案例

記錄一次MySql鎖等待 (Lock wait timeout exceeded)異常

[TOC](記錄一次MySql鎖等待 (Lock wait timeout exceeded)異常) Java執行一個SQL查詢未提交&#xff0c;遇到1205錯誤。 java.lang.Exception: ### Error updating database. Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transactionCluster…

動手學深度學習6.2 圖像卷積-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記&#xff0c;以及對課后練習的一些思考&#xff0c;自留回顧&#xff0c;也供同學之人交流參考。 本節課程地址&#xff1a;卷積層_嗶哩嗶哩_bilibili 代碼_嗶哩嗶哩_bilibili 本節教材地址&#xff1a;6.2. 圖像卷積 — 動…

Python使用watchdog庫實現監控文件系統的更改

1. 先下載對應庫&#xff1a; pip install watchdog import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandlerclass FileChangeHandler(FileSystemEventHandler):def on_modified(self, event):# 當文件被修改時觸發此方法…

淺析Nginx技術:開源高性能Web服務器與反向代理

什么是Nginx&#xff1f; Nginx是一款輕量級、高性能的HTTP和反向代理服務器&#xff0c;也可以用作郵件代理服務器。它最初由俄羅斯的程序員Igor Sysoev在2004年開發&#xff0c;并于2004年首次公開發布。Nginx的主要優勢在于其非阻塞的事件驅動架構&#xff0c;能夠處理大量并…

Vue3使用ref綁定組件獲取valueRef.value為null的解決

問題&#xff1a; onMounted(() > {nextTick(()>{console.log(treeselectRef, treeselectRef.value);console.log(treeselectRef.value, treeselectRef.value);}); });輸出&#xff1a; 查看綁定和定義都沒有問題&#xff0c;還是獲取不到 解決&#xff1a;使用getCur…

數據結構第17節 最小堆

最小堆&#xff08;Min Heap&#xff09;是一種特殊的完全二叉樹數據結構&#xff0c;在這種結構中&#xff0c;對于任意節點&#xff0c;其值都小于或等于它的子節點的值。根節點是堆中的最小元素。最小堆常用于實現優先隊列&#xff0c;以及堆排序算法。 在Java中&#xff0…