Zustand zwischen Astro-Inseln teilen
Wenn du eine Astro-Website mit Insel-Architektur / Partieller Hydratation aufbaust, bist du vielleicht schon auf dieses Problem gestoßen: Ich möchte den Zustand zwischen meinen Komponenten teilen.
UI-Frameworks wie React oder Vue nutzen “Kontext”-Anbieter, die von anderen Komponenten konsumiert werden können. Bei der partiellen Hydratation von Komponenten in Astro oder Markdown kannst du diese Kontext-Wrapper jedoch nicht verwenden.
Astro empfiehlt eine andere Lösung für die gemeinsame Speicherung auf der Client-Seite: Nano Stores.
Warum Nano Stores?
Abschnitt betitelt „Warum Nano Stores?“Die Nano Stores Bibliothek ermöglicht es dir, Stores zu erstellen, mit denen jede Komponente interagieren kann. Wir empfehlen Nano Stores aus folgenden Gründen:
- Sie sind leichtgewichtig. Nano Stores liefern das Minimum an JS, das du brauchst (weniger als 1 KB), ohne jegliche Abhängigkeiten.
- Sie sind Framework-agnostisch. Das bedeutet, dass die gemeinsame Nutzung von Zuständen zwischen Frameworks nahtlos ist! Astro ist auf Flexibilität ausgelegt, daher lieben wir Lösungen, die unabhängig von deiner Präferenz eine ähnliche Entwicklererfahrung bieten.
Dennoch gibt es eine Reihe von Alternativen, die du ausprobieren kannst. Dazu gehören:
- Svelte’s eingebaute Stores
- Solid signals außerhalb eines Komponentenkontextes
- Vue’s Reaktivitäts-API
- Senden von benutzerdefinierten Browser-Ereignissen zwischen Komponenten
🙋 Kann ich Nano Stores in .astro
-Dateien oder anderen serverseitigen Komponenten verwenden?
Nano Stores können in serverseitigen Komponenten importiert, beschrieben und gelesen werden, aber wir empfehlen es nicht! Das liegt an einigen Einschränkungen:
- Das Schreiben in einen Store aus einer
.astro
-Datei oder einer nicht-hydratisierten Komponente hat keine Auswirkung auf den Wert, der von Client-seitigen Komponenten (EN) empfangen wird. - Du kannst einen Nano Store nicht als “prop” an clientseitige Komponenten übergeben.
- Du kannst keine Änderungen aus einer
Astro
-Datei abonnieren, da Astro-Komponenten nicht neu gerendert werden.
Wenn du diese Einschränkungen verstehst und trotzdem einen Anwendungsfall findest, kannst du Nano Stores ausprobieren! Denke daran, dass Nano Stores speziell für die Reaktivität auf Änderungen auf dem Client konzipiert sind.
🙋 Wie unterscheiden sich die Svelte Stores von den Nano Stores?
Nano Stores und Svelte Stores sind sich sehr ähnlich! Tatsächlich kannst du in Nanostores die gleiche $
-Verknüpfung für Subscriptions verwenden, die du auch in Svelte Stores benutzen kannst.
Wenn du Bibliotheken von Drittanbietern vermeiden willst, sind Svelte Stores ein großartiges Werkzeug für die inselübergreifende Kommunikation. Dennoch könntest du Nano Stores bevorzugen, wenn dir a) die Add-ons für “objects” und async state gefallen oder b) du zwischen Svelte und anderen UI-Frameworks wie Preact oder Vue kommunizieren möchtest.
🙋 Wie unterscheiden sich Solid Signals von Nano Stores?
Wenn du schon eine Weile mit Solid arbeitest, hast du vielleicht schon versucht, signals oder stores außerhalb deiner Komponenten zu verschieben. Dies ist eine großartige Möglichkeit, den Zustand zwischen Solid-Inseln zu teilen! Versuche, Signals aus einer gemeinsamen Datei zu exportieren:
import { createSignal } from 'solid-js';
export const sharedCount = createSignal(0);
…und alle Komponenten, die sharedCount
importieren, teilen sich denselben Zustand. Obwohl dies gut funktioniert, könntest du Nano Stores bevorzugen, wenn du a) die Add-ons für “objects” und async state magst, oder b) zwischen Solid und anderen UI-Frameworks wie Preact oder Vue kommunizieren möchtest.
Nano Stores installieren
Abschnitt betitelt „Nano Stores installieren“Um loszulegen, installiere Nano Stores zusammen mit dem Hilfspaket für dein bevorzugtes UI-Framework:
npm install nanostores @nanostores/preact
npm install nanostores @nanostores/react
npm install nanostores @nanostores/solid
npm install nanostores
Hier gibt es kein Hilfspaket! Nano Stores können wie normale Svelte Stores verwendet werden.
npm install nanostores @nanostores/vue
Du kannst die Nano-Stores-Anleitung von hier aus aufrufen oder unserem Beispiel unten folgen!
Anwendungsbeispiel - E-Commerce Warenkorb-Flyout
Abschnitt betitelt „Anwendungsbeispiel - E-Commerce Warenkorb-Flyout“Nehmen wir an, wir bauen eine einfache E-Commerce-Oberfläche mit drei interaktiven Elementen:
- Ein “In den Warenkorb”-Formular
- Ein Warenkorb-Flyout, um die hinzugefügten Artikel anzuzeigen
- Ein Flyout-Knopf für den Einkaufswagen
Teste das fertige Beispiel auf deinem Rechner oder online über Stackblitz.
Deine Basis-Astro-Datei könnte so aussehen:
---import CartFlyoutToggle from '../components/CartFlyoutToggle';import CartFlyout from '../components/CartFlyout';import AddToCartForm from '../components/AddToCartForm';---
<!DOCTYPE html><html lang="en"><head>...</head><body> <header> <nav> <a href="/">Astro-Schaufenster</a> <CartFlyoutToggle client:load /> </nav> </header> <main> <AddToCartForm client:load> <!-- ... --> </AddToCartForm> </main> <CartFlyout client:load /></body></html>