restate / v1.0.0
常見問題
關於 restate 的渲染、儲存、scope 與錯誤的常見問題解答。
找不到相符的問題
換個字試試,或顯示所有問題。
基礎需要 Provider 嗎?
不需要。store 是模組層級的值,任何匯入它的元件都能使用。當狀態應該屬於單一元件實例時,請使用 useRestateScope。
基礎為什麼元件每次變化都會渲染?
不帶 selector 呼叫 Hook 會訂閱整個值。請傳入只回傳元件所顯示內容的 selector。
基礎selector 回傳物件,每次都會渲染。
新物件永遠不會與舊物件 Object.is 相等。把 shallow 作為第二個參數傳入,或分別選取各個欄位。
基礎改了物件,卻什麼都沒更新。
set 收到的是同一個物件,所以 restate 沒有察覺變化。請從 set 回傳新的物件或陣列。
儲存要在哪裡等待已儲存的資料?
儲存資料什麼時候寫入儲存空間?
只有在你呼叫 save(),或開啟 autoSave 後發生變化時才會寫入。編輯只會改變記憶體;status().dirty 會告訴你有未儲存的修改。
儲存該用 autoSave 還是 save()?
一律要儲存的設定與草稿用 autoSave。由使用者決定何時儲存時(例如「儲存」按鈕或表單送出)用 save()。即使開啟 autoSave,也可以呼叫 save(),例如在 pagehide 時。
錯誤restateManager.ready 被拒絕了,該怎麼辦?
錯誤出現 QUEUE_FULL 或 STORAGE_TIMEOUT。
儲存空間跟不上你排入的工作。不要在緊湊的迴圈中呼叫 save()——排隊中的儲存本來就會寫入最新的值——或改用有延遲的 autoSave。必要時調整 maxPendingOperations 與 operationTimeoutMs。
錯誤遲到的請求在卸載後寫入了 store。
對已銷毀的 store 呼叫 set() 與 reset() 會被忽略,就像卸載後的 React 狀態更新一樣。訂閱會拋出 STORE_DESTROYED,儲存指令會被拒絕。
scopescope 中的 store 忽略了新的 props。
工廠函式只會執行一次,就像 useState 的初始化函式。為每份文件替元件加上 key,新的文件就會得到新的 scope。
scope如何避免 hydration 不一致?
在伺服器與用戶端以 props 傳入相同的伺服器資料,並在 useRestateScope 中用它建立 store。初始值就會成為伺服器快照。
scope為什麼 scope 中的 store 不在 restateManager.ready 裡?
scope 中的持久化 store 會在所屬元件於用戶端提交後才開始載入。請在該元件內的載入邊界中等待 scope.manager.ready。
儲存React Native 上出現 MMKV_UNAVAILABLE。
安裝 react-native-mmkv 及其原生相依套件,然後重新建置應用程式。在 Expo 中請使用 development build。記憶體 store 不需要 MMKV 也能運作。