Reprise : données asynchrones
Le loader de page récupère les données initiales côté serveur ; elles atterrissent dans un signal, se sérialisent et reprennent sur le client — la liste s'affiche sans que le composant s'exécute. Le bouton Rafraîchir est un gestionnaire async qui await fetch() : il est lifté tel quel, donc au clic il recharge les données et met à jour le signal, toujours sans ré-exécuter le composant.
Astuce
La liste ci-dessous est rendue côté serveur puis reprise (aucune exécution du composant au chargement). Cliquez « Rafraîchir » — le gestionnaire async récupère de nouvelles données depuis /api/resumable-feed et le compteur + la liste se mettent à jour. Chaque fetch renvoie un numéro croissant pour prouver l'aller-retour réseau.
Démo en direct
3 items · server (SSR)
• Server-rendered item 1
• Server-rendered item 2
• Server-rendered item 3
"use resumable";
import { signal } from "@bext-stack/framework/signals";
// The page loader fetches the initial data and passes it as props →
// it lands in a signal, serializes into the island, and RESUMES on the
// client (the component never runs).
export default function Feed(props) {
const items = signal(props.items ?? []);
return (
<div>
{/* an ASYNC handler — lifts verbatim into __rh, awaits fetch on the
client, and updates the signal. No component re-run. */}
<button onClick={async () => {
const r = await fetch("/api/resumable-feed");
items.value = (await r.json()).items;
}}>Refresh</button>
<div>{items.value.length} items</div>
</div>
);
}