$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。