这是一个非常关键且容易混淆的概念
既然 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
:
javascript
// app.js
App({
globalData: {
appId: null
},
onLaunch: function() {
// 获取当前小程序 appid
const appId = wx.getAccountInfoSync().miniProgram.appId;
this.globalData.appId = appId;
wx.setStorageSync('appId', appId)
console.log('appId:', appId);
},
});
在其他页面获取本地存储的 appId
:
javascript
const appId = wx.getStorageSync('appId');
storage
和内存的区别,以及为什么本地存储中没有 appId
.