Skip to content

view 連接邏輯層 ​

畫面層專用,只在雙執行緒(runtime: 'dual')時可用;單執行緒呼叫會以 NOT_ALLOWED 失敗。需要容器 1.1.0(建議 1.2.0)。概念見單執行緒與雙執行緒。

sdk.view.connect() ​

ts
sdk.view.connect<D extends Record<string, unknown>>(
  onData: (data: D) => void,
  onError?: (error: unknown) => void,
): () => void
  1. 向邏輯層取一份完整的資料快照,回呼 onData 一次。
  2. 之後邏輯層每次 setData,都以合併後的完整資料(新物件)回呼 onData。
  3. 回傳取消函式;元件卸載時呼叫。
  • 邏輯層還沒啟動完成時,第一次回呼可能是空物件 {},definePage 的初始資料隨後以更新送達。畫面要能處理欄位還不存在的情況,判斷「已載入」時請檢查明確的欄位值(例如 status === 'ready'),不要用「不是 loading」。
  • 取快照失敗(例如不在容器內)時呼叫 onError,之後不會再回呼 onData。
  • 可以多次呼叫(多個元件各自連接),每個都拿到正確的資料。
  • 快照與更新的先後由 SDK 處理(容器 1.2.0 起帶序號),不會漏掉、也不會用舊值蓋掉新值。
ts
const off = sdk.view.connect<ViewData>(
  (data) => { state.value = data; },
  () => { state.value = { ...state.value, status: 'error' }; },
);
onBeforeUnmount(off);

sdk.view.emit() ​

ts
sdk.view.emit(name: string, payload?: unknown): Promise<void>

把畫面事件送給邏輯層,觸發 definePage({ handlers }) 裡的 handlers[name](payload)。

  • name 最多 64 字。payload 必須能 JSON 序列化。
  • Promise 在容器收到事件後 resolve,不代表 handler 已經執行完;結果請透過 setData 回到畫面層。
  • 邏輯層還在啟動時送出的事件會排隊,啟動後依序送達。
  • 邏輯層啟動失敗時以 INTERNAL 失敗(此時畫面已經顯示錯誤頁)。
  • 邏輯層沒有對應的 handler 時,錯誤會上報給容器,但 emit 本身不會失敗。