コンテンツにスキップ
ドキュメント
自動再検証

自動再検証

💡

データを手動で再検証する場合は、ミューテーションを確認してください。

フォーカス時の再検証

ページに再びフォーカスしたり、タブを切り替えたりすると、SWRは自動的にデータを再検証します。

これは、最新の状態にすぐに同期するために役立ちます。これは、古いモバイルタブや、**スリープ状態になった**ラップトップなどのシナリオでデータを更新する場合に役立ちます。

ビデオ:フォーカス再検証を使用して、ページ間のログイン状態を自動的に同期します。

この機能はデフォルトで有効になっています。revalidateOnFocus オプションを使用して無効にすることができます。

一定間隔での再検証

多くの場合、データは複数のデバイス、複数のユーザー、複数のタブによって変更されます。画面上のデータを時間の経過とともに更新するにはどうすればよいでしょうか?

SWRには、データを自動的に再フェッチするオプションがあります。これは**スマート**であり、再フェッチは、フックに関連付けられたコンポーネントが**画面上にある**場合にのみ発生することを意味します。

ビデオ:ユーザーが変更を行うと、両方のセッションは最終的に同じデータをレンダリングします。

refreshInterval 値を設定することで有効にできます

useSWR('/api/todos', fetcher, { refreshInterval: 1000 })

refreshWhenHiddenrefreshWhenOffline などのオプションもあります。どちらもデフォルトでは無効になっているため、Webページが画面に表示されていない場合、またはネットワーク接続がない場合、SWRはフェッチしません。

再接続時の再検証

ユーザーがオンラインに戻ったときに再検証することも役立ちます。このシナリオは、ユーザーがコンピューターのロックを解除したが、インターネットがまだ接続されていない場合によく発生します。

データが常に最新の状態であることを確認するために、SWRはネットワークが回復したときに自動的に再検証します。

この機能はデフォルトで有効になっています。revalidateOnReconnect オプションを使用して無効にすることができます。

自動再検証の無効化

リソースが**不変**であり、再検証しても変更されない場合は、すべて種類の自動再検証を無効にすることができます。

バージョン1.0以降、SWRはリソースを不変としてマークするためのヘルパーフック useSWRImmutable を提供しています

import useSWRImmutable from 'swr/immutable'
 
// ...
useSWRImmutable(key, fetcher, options)

通常の useSWR フックと同じAPIインターフェースを持っています。次の再検証オプションを無効にすることで、同じことを行うこともできます

useSWR(key, fetcher, {
  revalidateIfStale: false,
  revalidateOnFocus: false,
  revalidateOnReconnect: false
})
 
// equivalent to
useSWRImmutable(key, fetcher)

revalidateIfStale は、マウント時に古いデータがある場合にSWRが再検証するかどうかを制御します。

上記の2つのフックは**まったく同じ**ことを行います。データがキャッシュされると、二度とリクエストされません。

マウント時の再検証

マウント時にSWRの再検証を強制的にオーバーライドすると便利です。デフォルトでは、revalidateOnMount の値は未定義に設定されています。

SWRフックは次のようにマウントされます

  • 最初に、revalidateOnMount が定義されているかどうかを確認します。trueであればリクエストを開始し、falseであれば停止します。

マウント時の動作を制御するには、revalidateIfStale が役立ちます。デフォルトでは、revalidateIfStale はtrueに設定されています。

revalidateIfStale がtrueに設定されている場合、キャッシュデータがある場合にのみ再フェッチし、そうでない場合は再フェッチしません。