Compartilhe Estado Entre Ilhas
Ao construir um website Astro com a arquitetura em ilhas / hidratação parcial, você pode ter esse problema: Eu quero compartilhar estado entre meus componentes.
Frameworks de UI como React ou Vue podem encorajar provedores de “contexto” para outros componentes consumirem. Porém, ao parcialmente hidratar componentes no Astro ou Markdown, você não pode utilizar esses invólucros de contexto.
Astro recomenda uma solução diferente para armazenamento compartilhado no lado do cliente: Nano Stores.

Por que Nano Stores?
Seção intitulada “Por que Nano Stores?”A biblioteca Nano Stores permite que você escreva stores que qualquer componente pode interagir com. Nós recomendamos Nano Stores pois:
- São leves. Nano Stores envia o mínimo de JS que você vai precisar (menos do que 1KB) com zero dependências.
- São agnósticos a frameworks. Isso significa que compartilhar estado entre frameworks será tranquilo! Astro é feito para ser flexível, então adoramos soluções que oferecem uma experiência de desenvolvedor semelhante independente de sua preferência.
Mesmo assim, há várias alternativas que você pode explorar. Elas são:
- Stores integradas do Svelte
- Signals do Solid fora do contexto de um componente
- API de reatividade do Vue
- Enviar eventos customizados do navegador entre componentes
🙋 Posso utilizar Nano Stores em arquivos .astro
ou em outros componentes no lado do servidor?
Nano Stores podem ser importadas, escritas para e lidas de componentes no lado do servidor, porém nós não recomendamos! Isso por conta de algumas restrições:
- Escrever para uma store de um arquivo
.astro
ou componente não-hidratado não irá afetar os valores recebidos por componentes no lado do cliente. - Você não pode passar uma Nano Store como uma “prop” para componentes no lado do cliente.
- Você não pode inscrever-se para mudanças em uma store de um arquivo
.astro
, já que componentes Astro não são re-renderizados.
Se você entende estas restrições e ainda tem um caso de uso, você pode tentar dar uma chance as Nano Stores! Apenas lembre-se de que Nano Stores são feitas para reatividade em mudanças especificadamente no cliente.
🙋 Como Svelte stores se comparam a Nano Stores?
Nano Stores e Svelte stores são bastante similares! Na realidade, nanostores te permite utilizar o mesmo atalho $
para inscrições que você pode utilizar em Svelte stores.
Se você quiser evitar bibliotecas de terceiros, Svelte stores são uma ótima ferramenta de comunicação entre ilhas por si. Mesmo assim, você pode preferir Nano Stores se a) você gosta de seus add-ons para “objetos” e estado async, ou b) você quer se comunicar entre Svelte e outros frameworks de UI como Preact ou Vue.
🙋 Como signals do Solid se comparam a Nano Stores?
Se você utilizou Solid por um tempo, você deve ter tentado mover signals ou stores para fora de seus componentes. Esta é uma ótima forma de compartilhar estado entre ilhas de Solid! Tente exportar signals de um arquivo compartilhado:
import { createSignal } from 'solid-js';
export const contagemCompartilhada = createSignal(0);
…e todos os componentes importante contagemCompartilhada
irão compartilhar o mesmo estado. Apesar disso funcionar bem, você pode preferir Nano Stores se a) você gosta de seus add-ons para “objetos” e estado async, ou b) você quer se comunicar entre Solid e outros frameworks de UI como Preact ou Vue.
Instalando Nano Stores
Seção intitulada “Instalando Nano Stores”Para começar, instale Nano Stores junto de seu pacote auxiliar para seu framework de UI favorito:
npm install nanostores @nanostores/preact
npm install nanostores @nanostores/react
npm install nanostores @nanostores/solid
npm install nanostores
Nenhum pacote auxiliar aqui! Nano Stores podem ser utilizadas como Svelte stores padrões.
npm install nanostores @nanostores/vue
npm install nanostores @nanostores/lit
Você pode dar uma olhada no guia de uso do Nano Stores a partir daqui ou seguir com nosso exemplo abaixo!
Exemplo de uso - flyout de carrinho de ecommerce
Seção intitulada “Exemplo de uso - flyout de carrinho de ecommerce”Vamos dizer que estamos construindo uma interface de ecommerce simples com três elementos interativos:
- Um formulário de submissão de “adicionar ao carrinho”
- Um flyout de carrinho para mostrar os itens adicionados
- Um toggle do flyout de carrinho
Tente o exemplo completo em sua máquina ou online via Stackblitz.
Seu arquivo Astro base deve se parecer com isso:
---import ToggleFlyoutCarrinho from '../components/ToggleFlyoutCarrinho';import FlyoutCarrinho from '../components/FlyoutCarrinho';import FormAdicionarAoCarrinho from '../components/FormAdicionarAoCarrinho';---
<!DOCTYPE html><html lang="pt-BR"><head>...</head><body> <header> <nav> <a href="/">Loja Astro</a> <ToggleFlyoutCarrinho client:load /> </nav> </header> <main> <FormAdicionarAoCarrinho client:load> <!-- ... --> </FormAdicionarAoCarrinho> </main> <FlyoutCarrinho client:load /></body></html>