restate / v1.0.0
よくある質問
restate のレンダリング、保存、スコープ、エラーについてよくある質問への回答。
該当する質問がありません
別の言葉で試すか、すべての質問を表示してください。
基本Provider は必要ですか?
いいえ。ストアはモジュールレベルの値なので、import したどのコンポーネントからでも使えます。状態を 1 つのコンポーネントインスタンスに属させたいときは useRestateScope を使います。
基本変更のたびにコンポーネントがレンダリングされるのはなぜ?
selectorなしでフックを呼ぶと、値全体を購読します。コンポーネントが表示するものだけを返すselectorを渡してください。
基本selectorがオブジェクトを返して、毎回レンダリングされる。
新しいオブジェクトは、前のオブジェクトと Object.is で等しくなることはありません。2 番目の引数に shallow を渡すか、フィールドを別々に選択してください。
基本オブジェクトを変更したのに何も更新されない。
set が同じオブジェクトを受け取ったため、restate は変更を検出できませんでした。set からは新しいオブジェクトや配列を返してください。
保存保存データはどこで待てばいい?
クライアントのエントリーで一度だけです。アプリを描画する前に await restateManager.ready を実行してください。その後はコンポーネントが保存済みの値をそのまま読めます。useRestateScope 内のストアは、それぞれの scope.manager.ready を待ちます。
保存データがストレージに書き込まれるのはいつ?
save() を呼んだとき、または autoSave がオンのときの変更後だけです。編集で変わるのはメモリだけで、status().dirty で未保存の変更があるとわかります。
保存autoSave と save() のどちらを使うべき?
常に保存したい設定や下書きには autoSave を使います。保存ボタンやフォーム送信など、ユーザーが決めるときは save() を使います。autoSave がオンでも、たとえば pagehide で save() を呼べます。
エラーrestateManager.ready が reject された。どうすればいい?
レコードを読み込めない、マイグレーションできない、または検証を通らないとき、BULK_OPERATION_FAILED で reject されます。error.failures に各ストアとそのエラーが入っています。レコードを修正またはクリアし、そのストアの initialize() を呼んでから、もう一度 ready にアクセスしてください。
エラーQUEUE_FULL や STORAGE_TIMEOUT が出る。
キューに積む処理にストレージが追いついていません。save() を短いループで呼ばないでください(待機中の保存はすでに最新の値を書きます)。または待ち時間付きの autoSave を使います。必要に応じて maxPendingOperations と operationTimeoutMs を調整してください。
エラー遅れて届いたリクエストが、アンマウント後にストアへ書き込む。
破棄されたストアへの set() と reset() は、アンマウント後の React の state 更新と同じく無視されます。購読しようとすると STORE_DESTROYED を投げ、ストレージのコマンドは reject されます。
スコープスコープのストアが新しい props を無視する。
ファクトリーは useState の初期化関数と同じく一度だけ実行されます。ドキュメントごとに key を付けてコンポーネントを描画すれば、新しいドキュメントには新しいスコープが用意されます。
スコープハイドレーションの不一致を避けるには?
サーバーとクライアントで同じサーバーデータを props として渡し、useRestateScope の中でそこからストアを作ります。初期値がサーバースナップショットになります。
スコープスコープのストアが restateManager.ready に含まれないのはなぜ?
スコープの保存ストアは、所有するコンポーネントがクライアントでコミットされてから読み込みを始めます。そのコンポーネントの中のローディング境界で scope.manager.ready を待ってください。
保存React Native で MMKV_UNAVAILABLE が出る。
react-native-mmkv とそのネイティブ依存をインストールしてから、アプリをリビルドしてください。Expo では development build を使います。メモリのストアは MMKV なしで動きます。