$sessionStorage
在当前行程内,为当前仪表实例保存临时状态,例如该仪表观察到的最高速度、累计次数或上一帧的计算结果。行程结束后清空。
存储范围
这里的“会话”指 当前这一段行程。同一行程中,仪表多次执行 main() 时可以取回之前保存的值,因此适合维护峰值、计数器等跨帧状态。
存储同时归属于当前仪表实例:在页面上放置两块相同仪表,各自保存自己的状态。
何时保留,何时清空
| 情况 | 存储行为 |
|---|---|
| 同一行程、同一个持续运行的仪表实例 | 多次调用 main() 之间保留。 |
| 当前行程结束,或 App 退出记录状态 | 清空。没有活动行程时 get 返回 null,set 不保留写入。 |
| 开始下一段行程 | 从空存储开始,不继承上一段的值。 |
| 仪表脚本重新加载、绘制实例被销毁或 App 重启 | 临时值丢失,即使之后仍在同一行程中,也不会恢复。 |
| 编辑器预览 | 使用独立的预览存储,不写入实车行程;切换到实际运行时不会沿用预览值。 |
它保存的是仪表运行期间观察和计算出的状态。中途才打开仪表,不能自动得到打开之前的行程峰值;需要长期保留的数据也不应仅保存在这里。
读写对象与数组
get 和 set 都使用数据副本。例如,取出一个数组后向其中添加元素,存储里的原数组不会随之改变,需要再调用 set 才会保存修改。
键必须是字符串。可以保存有限数字、字符串、布尔值、null,以及由这些值组成的普通对象和数组。函数、View、循环引用和特殊对象不能保存。把某个键设为 null 后,读取该键得到 null;当前接口提供 get 和 set 两个方法。
示例:本次行程中观察到的最高速度
在 参数配置 中定义两个 基础数据 输入:标识符 speed 的速度,以及标识符 recording 的记录状态。没有活动行程时显示横线;每次运行把当前速度与已保存峰值比较,再保存较大值。峰值统一以 km/h 保存,显示时按当前单位转换,避免混用单位。
缺测时保留已观察到的峰值,有效零值正常参与计算;下一段行程从空值开始。
function main() {
if ($data.current.recording !== true) {
return (
<Text fontSize={48} color={$env.foreground}>
—
</Text>
);
}
const speed = $data.current.speed;
const saved = $sessionStorage.get('peakKmh');
let peak = typeof saved === 'number' ? saved : null;
if (typeof speed?.value === 'number') {
const kmh = speed.unit === 'mph' ? speed.value * 1.609344 : speed.value;
peak = peak == null ? kmh : Math.max(peak, kmh);
$sessionStorage.set('peakKmh', peak);
}
const unit = speed?.unit ?? $env.speedUnit;
const value =
peak == null ? '—' : Math.round(unit === 'mph' ? peak / 1.609344 : peak);
return (
<VStack spacing={6}>
<Text fontSize={48} color={$env.foreground}>
{value}
</Text>
<Text color={$env.accent}>{unit}</Text>
</VStack>
);
}
容量限制
每个存储最多 256 个键,总数据量约 1 MiB;单个键最多 256 个 UTF-8 字节。值的复制也有大小和嵌套限制。超过限制或传入不支持的值会报错,失败写入不会覆盖原来的有效值。
适合保存少量统计状态。长时间逐帧追加数组会持续增长,曲线应优先使用 $data.history,或自行限制数组长度。
方法
get(key: string)unknown | null读取当前行程中这个仪表实例保存的值。键不存在时返回 null;对象和数组返回独立副本。
set(key: string, value: unknown)void保存或覆盖指定键。值会复制后保存;没有活动行程时不保留写入。返回 undefined。