引数
デフォルトでは、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
引数全体に関連付けられます。上記の例では、url
と token
はどちらもキャッシュキーに関連付けられています。
⚠️
以前のバージョン(< 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はレンダリングごとに引数を**浅く**比較し、いずれかが変更された場合に再検証をトリガーします。