コンテンツにスキップ
ドキュメント
引数

引数

デフォルトでは、key は引数として fetcher に渡されます。そのため、次の3つの式は同等です。

useSWR('/api/user', () => fetcher('/api/user'))
useSWR('/api/user', url => fetcher(url))
useSWR('/api/user', fetcher)

複数の引数

状況によっては、fetcher 関数に複数の引数(任意の値またはオブジェクト)を渡すと便利な場合があります。たとえば、認証付きフェッチリクエストの場合

useSWR('/api/user', url => fetchWithToken(url, token))

これは**正しくありません**。データの識別子(キャッシュキー)は '/api/user' であるため、token が変更されても、SWRは同じキーを使用して間違ったデータを返します。

代わりに、key パラメータとして**配列**を使用できます。これには、fetcher の複数の引数が含まれます。

const { data: user } = useSWR(['/api/user', token], ([url, token]) => fetchWithToken(url, token))

fetcher 関数は key パラメータをそのまま受け取り、キャッシュキーも key 引数全体に関連付けられます。上記の例では、urltoken はどちらもキャッシュキーに関連付けられています。

⚠️

以前のバージョン(< 2.0.0)では、key 引数が配列型の場合、fetcher 関数は元の key から展開された引数を受け取ります。たとえば、キー [url, token] は、fetcher 関数にとって2つの引数 (url, token) になります。

オブジェクトの受け渡し

💡

SWR 1.1.0以降、オブジェクトのようなキーは内部で自動的にシリアライズされます。

ユーザー スコープでデータをフェッチする別の関数 fetchWithUser(api, user) があるとします。次のことができます。

const { data: user } = useSWR(['/api/user', token], fetchWithToken)
 
// ...and then pass it as an argument to another useSWR hook
const { data: orders } = useSWR(user ? ['/api/orders', user] : null, fetchWithUser)

オブジェクトをキーとして直接渡すことができ、fetcher もそのオブジェクトを受け取ります。

const { data: orders } = useSWR({ url: '/api/orders', args: user }, fetcher)
⚠️

古いバージョン(< 1.1.0)では、SWRはレンダリングごとに引数を**浅く**比較し、いずれかが変更された場合に再検証をトリガーします。