這是一個非常關鍵且容易混淆的概念
既然 this.globalData.appId = appId
是將 appId
存儲在內存中,為什么微信小程序中的 wx.getStorage
和 wx.setStorage
(本地存儲)中沒有 appId
,并且您提出了一個非常重要的疑問:storage
不就是內存嗎?
關鍵區別:
您提出的疑問揭示了一個核心概念:微信小程序中的 storage
(本地存儲)和內存是兩個完全不同的存儲區域,它們之間有本質的區別。
-
內存(Memory):
- 臨時存儲: 內存是 臨時性 的存儲區域,用于存儲程序運行時的數據。
- 快速訪問: 內存的讀寫速度非常快,因此訪問內存中的數據效率很高。
- 生命周期: 內存中的數據隨著程序(這里指小程序)的啟動而創建,隨著程序的關閉而釋放。
- 全局數據: 使用
this.globalData = {}
方式定義的數據, 例如this.globalData.appId
等, 都是存儲在內存中的。 - 例子:
- JavaScript 變量 (如
const appId = ...
) - 小程序實例的全局數據 (
this.globalData
) - 函數調用棧
- JavaScript 變量 (如
-
本地存儲(
wx.setStorage
/wx.getStorage
):- 持久化存儲: 本地存儲是 持久化 的存儲區域,用于存儲需要在小程序關閉后仍然保留的數據。
- 讀寫速度較慢: 本地存儲的讀寫速度比內存慢,因為需要進行文件 I/O 操作。
- 容量限制: 本地存儲通常有一定的容量限制,微信小程序也有限制, 請注意控制存儲數據的大小。
- 生命周期: 本地存儲中的數據會一直存在,直到被顯式刪除或小程序被卸載。
- 刪除: 可以通過
wx.removeStorage
來刪除本地存儲。 - 清空: 可以通過
wx.clearStorage
來清空本地存儲。
- 刪除: 可以通過
- 例子:
- 用戶登錄狀態
- 用戶設置信息
- 緩存的 API 響應數據
storage
和內存的本質區別:
特性 | 內存 (Memory) | 本地存儲 (Storage) |
---|---|---|
類型 | 臨時存儲 | 持久化存儲 |
讀寫速度 | 非常快 | 較慢 |
容量 | 有限,受設備限制 | 有限,受小程序限制 |
數據生命周期 | 隨程序運行而存在,隨程序關閉而釋放 | 除非被刪除或者小程序卸載,一直存在 |
為什么本地存儲中沒有 appId
:
- 您沒有顯式地使用
wx.setStorage
API 存儲appId
:- 您只是將
appId
存儲在了內存中,通過this.globalData.appId = appId
賦值,并沒有將appId
使用wx.setStorage
API 存儲到本地存儲中。
- 您只是將
- 本地存儲中只保存了您明確調用
wx.setStorage
存儲的數據:- 微信小程序只會在您調用
wx.setStorage
或wx.setStorageSync
API 時,才會將數據存儲到本地存儲。
- 微信小程序只會在您調用
總結:
- 內存和本地存儲是完全不同的概念: 內存是臨時的,本地存儲是持久的。
- 您只是將
appId
存儲在了內存中: 使用this.globalData.appId = appId
, 并沒有存儲到本地存儲中。 - 本地存儲需要顯式調用
wx.setStorage
: 您需要使用wx.setStorage
或wx.setStorageSync
API,才能將數據存儲到本地存儲。
如何將 appId
存儲到本地存儲?
如果您希望將 appId
存儲到本地存儲,您需要在設置 this.globalData.appId
的同時,顯式地調用 wx.setStorage
或 wx.setStorageSync
:
// app.js
App({globalData: {appId: null},onLaunch: function() {// 獲取當前小程序 appidconst appId = wx.getAccountInfoSync().miniProgram.appId;this.globalData.appId = appId;wx.setStorageSync('appId', appId)console.log('appId:', appId);},
});
在其他頁面獲取本地存儲的 appId
:
const appId = wx.getStorageSync('appId');
storage
和內存的區別,以及為什么本地存儲中沒有 appId
.