Tus islas son piezas independientes: cada una tiene su árbol React/Vue/Svelte y su propio estado local. ¿Y si quieres que dos islas distintas comparten un valor? Por ejemplo, un carrito que se actualiza desde el botón "Añadir" en una parte de la página y se muestra en el contador del header.
Las opciones malas:
dispatchEvent). Funcionan, pero son frágiles y tipan mal.La opción que recomienda Astro: nanostores.
Nanostores es una librería minúscula (~300 bytes) que ofrece:
atom, y la API es .get() y .set().cartCount es un átomo: un valor reactivo. Los componentes que se suscriban a él se actualizan cuando cambia.
Astro tiene un binding oficial: @nanostores/react (y para Vue, Svelte, etc.).
Las dos islas (React y Vue) comparten exactamente el mismo store. Si haces click en el botón React, el header Vue se actualiza al instante.
atomNanostores también ofrece:
map(...) para objetos con campos individuales.computed(...) para valores derivados (suma de carrito, totales con IVA...).persistentAtom(...) para sincronizar con localStorage.Tienes src/stores/cart.ts vacío. Tu trabajo:
atom desde "nanostores".cartCount inicializada a atom(0).addItem() que haga cartCount.set(cartCount.get() + 1).Aunque en este editor no haya islas reales escuchando el store, el código que escribes es exactamente el que pondrías en producción. En un proyecto real, tus componentes React/Vue/Svelte se suscribirían a cartCount con su binding correspondiente.