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() を呼べます。

保存プライベートウィンドウや SSR で保存に失敗する。

ストレージが使えないとき、ストアはメモリ上で動き続け、status().available は false になり、save() は STORAGE_UNAVAILABLE で reject されます。起動は問題なく成功します。

エラー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 なしで動きます。

ドキュメントを検索

すべてのガイドのタイトル、説明、本文から検索します。