Comparte el estado entre Islas
Al construir tu proyecto usando la arquitectura de islas / hidratación parcial, puede que te hayas topado con este problema: Quiero compartir estado entre mis componentes.
Frameworks tales como React o Vue pueden alentar a usar proveedores de “contexto” (“context” providers) para que sea consumido por otros componentes. Pero al hidratar componentes parcialmente dentro de Astro o en Markdown, no puedes usar esos contextos envolventes.
Astro recomienda una solución diferente para el almacenamiento compartido en el lado del cliente: Nano Stores.

¿Por qué Nano Stores?
Sección titulada «¿Por qué Nano Stores?»La librería Nano Stores te permite crear stores con las que cualquier componente puede interactuar. Recomendamos Nano Stores porque:
- Son livianas. Nano Stores tiene la cantidad mínima de JS que puedas llegar a requerir (menos de 1 KB) con cero dependencias.
- Son framework-agnósticas. ¡Esto significa que puedes compartir estado entre frameworks sin contratiempos! Astro está construido para ser flexible, así que amamos las soluciones que ofrecen una experiencia de desarrollo similar, sin importar tu preferencia.
Aun así, hay otras alternativas a explorar. Entre ellas puedes encontrar:
- Svelte stores incorporadas
- Solid signals fuera de un elemento de contexto
- API de reactividad de Vue
- Enviar eventos personalizados del navegador entre componentes
🙋 ¿Puedo usar Nano Stores en archivos .astro
u otros archivos del lado del servidor?
Las Nano Stores pueden ser importadas, escritas y leídas desde componentes del lado del servidor, ¡aunque no lo recomendamos!. Esto se debe a ciertas restricciones:
- Escribir en un store desde un archivo
.astro
o un componente no-hidratado no afectará el valor recibido por un componente del lado del cliente. - No puedes pasar una Nano Store como “prop” a componentes del lado del cliente.
- No puedes suscribirte a cambios en la store desde un archivo
.astro
, ya que los componentes de Astro no se re-renderizan.
¡Si entiendes estas restricciones y aun así encuentras un caso de uso, puedes darle una oportunidad a Nano Stores! Solamente recuerda que Nano Stores fue creado específicamente para reaccionar a cambios en el cliente.
🙋 ¿Cómo se comparan las Svelte stores a Nano Stores?
¡Nano Stores y Svelte stores son muy similares! De hecho, nanostores te permite usar el mismo atajo $
para suscripciones que puedes utilizar con las Svelte stores.
Si quieres evitar usar una librería de terceros, Svelte stores es una gran herramienta para la comunicación entre islas. Aun así, puedes llegar a preferir Nano Stores si a) te gustaría añadir add-ons para “objetos” y estado asíncrono, o b) quieres comunicarte entre Svelte y otros frameworks como Preact o Vue.
🙋 ¿Cómo se comparan las Solid signals a Nano Stores?
Si has usado Solid anteriormente, habrás intentado mover signals o stores fuera de tus componentes. ¡Esta es una muy buena manera de compartir estado entre islas de Solid! Intenta exportar signals desde un archivo compartido:
import { createSignal } from 'solid-js';
export const sharedCount = createSignal(0);
…y todos los componentes que importen sharedCount
compartirán el mismo estado. Aunque esto funciones bien, puedes llegar a preferir Nano Stores si a) te gustaría añadir add-ons para “objetos” y estado asíncrono, o b) quieres comunicarte entre Solid y otros frameworks como Preact or Vue.
Instalando Nano Stores
Sección titulada «Instalando Nano Stores»Para empezar, instala Nano Stores junto al paquete helper para tu framework favorito:
npm install nanostores @nanostores/preact
npm install nanostores @nanostores/react
npm install nanostores @nanostores/solid
npm install nanostores
¡No se necesita paquete helper aquí! Nano Stores puede ser usado como una Svelte store estándar.
npm install nanostores @nanostores/vue
npm install nanostores @nanostores/lit
¡Desde aquí, puedes saltar directamente a la guía de uso de Nano Stores, o seguir nuestra guía con ejemplos!
Ejemplo de uso - menú desplegable con carrito de ecommerce
Sección titulada «Ejemplo de uso - menú desplegable con carrito de ecommerce»Digamos que queremos construir una interfaz de ecommerce simple con tres elementos interactivos:
- Un formulario para “agregar al carrito”
- Un menú desplegable con carrito para mostrar esos ítems agregados
- Un botón para desplegar el menú con carrito
Prueba el ejemplo terminado en tu máquina u online vía StackBlitz.
Tu archivo base de Astro podría verse así:
---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="/">Tienda de Astro</a> <CartFlyoutToggle client:load /> </nav> </header> <main> <AddToCartForm client:load> <!-- ... --> </AddToCartForm> </main> <CartFlyout client:load /></body></html>