Arguments
Par défaut, key
sera passé à fetcher
comme argument. Donc les 3 expressions suivantes sont équivalentes:
useSWR('/api/user', () => fetcher('/api/user'))
useSWR('/api/user', url => fetcher(url))
useSWR('/api/user', fetcher)
Arguments multiples
Dans certains cas, il est utile de passer plusieurs arguments (pouvant être de n'importe quelle valeur ou objet) à la fonction fetcher
. Par exemple, une requête fetch autorisée:
useSWR('/api/user', url => fetchWithToken(url, token))
C'est incorrect. Parce que l'identifiant (également la clé de cache) des données est '/api/user'
, même si token
change, SWR utilisera toujours la même clé et renverra les mauvaises données.
A la place, vous pouvez utiliser un tableau comme paramètre key
, qui contient plusieurs arguments de fetcher
:
const { data: user } = useSWR(['/api/user', token], ([url, token]) => fetchWithToken(url, token))
La fonction fetcher
accepte le paramètre key
tel quel, et la clé de cache sera également associée à l'ensemble de l'argument key
. Dans l'exemple ci-dessus, url
et token
sont tous deux liés à la clé de cache.
Dans les précédentes versions (< 2.0.0), la fonction fetcher
recevait les arguments étalés de la clé d'origine lorsque l'argument key
était de type tableau. Par exemple, la clé [url, token]
deviendra 2 arguments (url, token)
pour la fonction fetcher
.
Passer des Objets
Depuis SWR 1.1.0, les clés de type objet seront automatiquement sérialisées en arrière-plan.
Disons que vous avez une autre fonction qui récupère des données avec une portée utilisateur: fetchWithUser(api, user)
. Vous pouvez faire ce qui suit:
const { data: user } = useSWR(['/api/user', token], fetchWithToken)
// ...et ensuite le passer en argument à un autre hook useSWR
const { data: orders } = useSWR(user ? ['/api/orders', user] : null, fetchWithUser)
Vous pouvez également utiliser un objet comme clé, et fetcher
recevra cet objet en tant qu'argument:
const { data: orders } = useSWR({ url: '/api/orders', args: user }, fetcher)
Dans les versions antérieures (< 1.1.0), SWR superficiellement compare les arguments à chaque rendu, et déclenche une revalidation si l'un d'entre eux a changé.