shouldRevalidate
この関数を使用すると、アクション後やクライアントサイドのナビゲーション後にどのルートのデータをリロードすべきかをアプリが最適化できます。
クライアントサイドのトランジション中、Remix は、変更されていないレイアウトルートをリロードしないなど、すでにレンダリングされているルートのリロードを最適化します。フォームの送信や検索パラメータの変更など、他のケースでは、Remix はどのルートをリロードする必要があるかを知らないため、安全のためにすべてをリロードします。これにより、UI が常にサーバー上の状態と同期していることが保証されます。
この関数を使用すると、Remix がルートをリロードしようとしているときに false
を返すことで、アプリをさらに最適化できます。ルートモジュールでこの関数を定義すると、Remix はすべてのナビゲーションとアクションが呼び出された後のすべての再検証で、この関数に従います。繰り返しますが、間違ったことをすると、UI がサーバーと同期しなくなる可能性があるため、注意してください。
fetcher.load
の呼び出しも再検証しますが、特定の URL をロードするため、ルートパラメータや URL 検索パラメータの再検証を気にする必要はありません。fetcher.load
は、デフォルトではアクションの送信後と、useRevalidator
を介した明示的な再検証リクエスト後にのみ再検証します。
actionResult
送信によって再検証が発生した場合、これはアクションの結果となります。アクションデータか、アクションが失敗した場合はエラーのいずれかです。shouldRevalidate
に再検証するかどうかを指示するために、アクションの結果に何らかの情報を含めるのが一般的です。
defaultShouldRevalidate
デフォルトでは、Remix はすべてのローダーを常に呼び出すわけではありません。デフォルトで信頼できる最適化が可能です。たとえば、変更されたパラメーターを持つローダーのみが呼び出されます。次の URL から下の URL に移動することを考えてみましょう。
/projects/123/tasks/abc
/projects/123/tasks/def
Remix は projects/123
のパラメーターが変更されていないため、tasks/def
のローダーのみを呼び出します。
false
を返す特定の最適化を行った後は、常に defaultShouldRevalidate
を返すのが最も安全です。そうしないと、UI がサーバー上のデータと同期しなくなる可能性があります。
これはより危険ですが、YOLO:
currentParams
これらは、リロードが必要かどうかを判断するために nextParams
と比較できる、URLのURLパラメータです。データ読み込みのためにパラメータの一部のみを使用している場合、パラメータの余分な部分が変更されても再検証する必要はありません。
たとえば、IDと人間が理解しやすいタイトルを持つイベントのスラッグを考えてみましょう。
/events/blink-182-united-center-saint-paul--ae3f9
/events/blink-182-little-caesars-arena-detroit--e87ad
currentUrl
これはナビゲーションが開始された元の URL です。
nextParams
ナビゲーションの場合、これらはユーザーがリクエストしている次のロケーションからのURLパラメーターです。一部の再検証はナビゲーションではないため、単純に currentParams
と同じになります。
nextUrl
ナビゲーションの場合、これはユーザーがリクエストしている URL です。一部の再検証はナビゲーションではないため、単に currentUrl
と同じになります。
formMethod
再検証をトリガーしたフォーム送信で使用されたメソッド(おそらく "GET"
または "POST"
)。
formAction
再検証をトリガーしたフォームアクション (<Form action="/somewhere">
)。
formData
再検証をトリガーしたフォームで送信されたデータ。
ユースケース
ルートのリロードをしない
ルートローダーが、クライアントアプリに送信される環境変数のように、決して変更されないデータを返すことはよくあります。このような場合、ルートローダーを再度呼び出す必要は決してありません。この場合、単に return false
を返すことができます。
このように設定すると、Remix はフォームの送信後や検索パラメータの変更後など、いかなる理由があってもルートローダーへのリクエストを行わなくなります。
検索パラメータの無視
もう一つのよくあるケースは、ネストされたルートがあり、子コンポーネントがURLの検索パラメータを使用する機能を持っている場合です。例えば、検索ページや、検索パラメータに状態を保持したいタブなどです。
次のルートを考えてみましょう。
├── $projectId.tsx
└── $projectId.activity.tsx
そして、UIが次のようなものだとしましょう。
+------------------------------+
| プロジェクト: デザイン刷新 |
+------------------------------+
| タスク | コラボ | >アクティビティ |
+------------------------------+
| 検索: _____________ |
| |
| - Ryanが画像を追加しました |
| |
| - Michaelがコメントしました |
| |
+------------------------------+
$projectId.activity.tsx
のローダーは、検索パラメータを使用してリストをフィルタリングできます。そのため、/projects/design-revamp/activity?search=image
のようなURLにアクセスすると、結果のリストがフィルタリングされる可能性があります。おそらく、次のようになります。
これはアクティビティルートにとっては素晴らしいことですが、Remixは親ローダーである $projectId.tsx
が検索パラメータを も 気にしているかどうかを知りません。そのため、Remixは最も安全な方法として、検索パラメータが変更されたときにページ上のすべてのルートをリロードします。
このUIでは、$projectId.tsx
が検索パラメータを使用しないため、ユーザー、サーバー、データベースにとって帯域幅の無駄になります。$projectId.tsx
のローダーが次のようになっているとしましょう。
これを行う方法はたくさんあり、アプリの残りのコードも重要ですが、理想的には、最適化しようとしているUI(検索パラメータの変更)について考えるのではなく、ローダーが気にする値を見るべきです。この場合、ローダーはprojectIdのみを気にしているので、次の2つのことを確認できます。
- パラメータは同じままだったか?
POST
ではなくGET
だったか?
パラメータが変更されず、POST
を実行しなかった場合、ローダーは前回と同じデータを返すことがわかります。そのため、子ルートが検索パラメータを変更したときに再検証をオプトアウトできます。