引数
デフォルトで key
は引数として fetcher
に渡されます。したがって、次の三つの式は同等です:
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 は同じキーを使用してしまい間違ったデータを返します。
代わりに、fetcher
の複数の引数を含む配列を key
パラメーターとして使用できます。
const { data: user } = useSWR(['/api/user', token], ([url, token]) => fetchWithToken(url, token))
fetcher
関数は key
パラメータをそのまま受け取り、キャッシュキーもまた key
の引数全てと関連づけられます。上記の例では url
と token
の組み合わせがキャッシュキーとなります。
⚠️
In older versions (< 2), The fetcher
function accepts the key
parameter as arguments separately
オブジェクトの受け渡し
💡
SWR 1.1.0 からは、オブジェクトのようなキーは内部で自動的にシリアライズされます。
あるユーザースコープでデータを取得する別の関数があるとします: fetchWithUser(api, user)
。その場合、以下のようにできます:
const { data: user } = useSWR(['/api/user', token], fetchWithToken)
// ...次に、それを引数として別の useSWR フックに渡します
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 はすべてのレンダリングで引数を浅く比較し、いずれかが変更された場合は再検証を実行します。