Skip to content
Docs
Préchargement des données

Préchargement des données

Données de page de premier niveau

Il existe de nombreuses façons de précharger les données pour SWR. Pour les demandes de premier niveau, rel="preload" (opens in a new tab) est fortement recommandé :

<link rel="preload" href="/api/data" as="fetch" crossorigin="anonymous">

Il suffit de le mettre à l'intérieur de votre <head> HTML. C'est facile, rapide et natif.

Il préchargera les données lorsque le HTML se charge, même avant que JavaScript ne commence à se télécharger. Toutes vos demandes de récupération entrantes avec la même URL réutiliseront le résultat (y compris SWR, bien sûr).

Préchargement programmable

SWR fournit l'API preload pour précharger les ressources de manière programmatique et stocker les résultats dans le cache. preload accepte key et fetcher comme arguments.

Vous pouvez appeler preload même en dehors de React.

import { useState } from 'react'
import useSWR, { preload } from 'swr'
 
const fetcher = (url) => fetch(url).then((res) => res.json())
 
// Préchargez la ressource avant de rendre le composant User ci-dessous,
// cela empêche les cascades potentielles dans votre application.
// Vous pouvez également commencer à précharger lorsque vous survolez le bouton ou le lien.
preload('/api/user', fetcher)
 
function User() {
  const { data } = useSWR('/api/user', fetcher)
  ...
}
 
export default function App() {
  const [show, setShow] = useState(false)
  return (
    <div>
      <button onClick={() => setShow(true)}>Afficher l'utilisateur</button>
      {show ? <User /> : null}
    </div>
  )
}

Dans l'arbre de rendu React, preload est également disponible pour une utilisation dans les gestionnaires d'événements ou les effets.

function App({ userId }) {
  const [show, setShow] = useState(false)
 
  // preload in effects
  useEffect(() => {
    preload('/api/user?id=' + userId, fetcher)
  }, [userId])
 
  return (
    <div>
      <button
        onClick={() => setShow(true)}
        {/* précharger dans les rappels d'événements */}
        onHover={() => preload('/api/user?id=' + userId, fetcher)}
      >
        Afficher l'utilisateur
      </button>
      {show ? <User /> : null}
    </div>
  )
}

Avec des techniques comme le prefetching de page (opens in a new tab) dans Next.js, vous pourrez charger à la fois la page suivante et les données instantanément.

En mode Suspense, vous pouvez utiliser preload pour éviter les problèmes de cascade.

import useSWR, { preload } from 'swr'
 
// doit être appelé avant le rendu
preload('/api/user', fetcher);
preload('/api/movies', fetcher);
 
const Page = () => {
  // Les hooks useSWR ci-dessous suspendront le rendu, mais les demandes à `/api/user` et `/api/movies` ont déjà commencé par `preload`,
  // donc le problème de cascade ne se produit pas.
  const { data: user } = useSWR('/api/user', fetcher, { suspense: true });
  const { data: movies } = useSWR('/api/movies', fetcher, { suspense: true });
  return (
    <div>
      <User user={user} />
      <Movies movies={movies} />
    </div>
  );
}

Données prérenplie

Si vous souhaitez préremplir des données existantes dans le cache SWR, vous pouvez utiliser l'option fallbackData. Par exemple :

useSWR('/api/data', fetcher, { fallbackData: prefetchedData })

Si SWR n'a pas encore récupéré les données, ce hook renverra prefetchedData comme fallback.

Vous pouvez aussi configurer ceci pour tous les hooks SWR et plusieurs clés avec <SWRConfig> et l'option fallback. Voir Next.js SSG and SSR pour plus de détails.