0Pricing
React Academy · Aula

O Problema das Assinaturas em Armazenamentos Externos

Compreenda o tearing e por que as assinaturas com useState ou useRef em armazenamentos externos não são seguras no React concorrente.

O Problema das Assinaturas em Armazenamentos Externos é uma aula grátis de React Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.

O que é um armazenamento externo

Um armazenamento externo é qualquer fonte de estado que viva fora da árvore do React, como um armazenamento Redux, uma API do navegador como matchMedia ou um objeto simples no nível do módulo com seu próprio mecanismo de inscrição.

O React não é dono desse estado, portanto precisa se inscrever nas alterações e ler instantâneos para manter os componentes sincronizados com o que o armazenamento contém atualmente.

A inscrição ingênua com useState + useEffect

Uma abordagem comum lê o valor do armazenamento em useState e depois usa useEffect para se inscrever e chamar setState sempre que o armazenamento mudar. À primeira vista, isso parece manter o componente atualizado.

Funciona em uma renderização síncrona simples, mas tem uma falha sutil que se torna visível quando o React renderiza de forma concorrente e pode pausar ou reiniciar o trabalho no meio do processo.

O problema da fragmentação

A fragmentação acontece quando diferentes partes da interface exibem valores diferentes do mesmo armazenamento durante uma única passagem de renderização. A renderização concorrente pode interromper e retomar o trabalho, e o armazenamento pode mudar nesse intervalo.

O resultado é uma tela inconsistente, na qual um componente mostra o valor antigo e outro mostra o novo, uma inconsistência que era efetivamente impossível antes dos recursos concorrentes.

Exemplo: fragmentação com modo escuro durante a renderização

Imagine vários componentes lendo um armazenamento de tema enquanto o React renderiza de forma concorrente. Se o usuário alternar para o modo escuro no meio do processo, os componentes renderizados antes da alternância mostrarão o tema claro, e os renderizados depois mostrarão o escuro.

Você acaba com uma tela parcialmente clara e parcialmente escura durante um quadro, porque o valor do armazenamento mudou durante uma renderização que o React não tratou atomicamente.

Por que useEffect chega tarde demais

Os efeitos são executados depois que a renderização é confirmada, portanto uma inscrição baseada em useEffect não consegue garantir que o valor lido durante a renderização corresponda ao armazenamento no momento da confirmação. A inscrição é acionada tarde demais para evitar uma exibição inconsistente.

Quando o efeito se inscreve novamente e atualiza o estado, o quadro inconsistente talvez já tenha sido mostrado ao usuário.

O useMutableSource obsoleto

Uma API experimental anterior chamada useMutableSource tentou resolver leituras externas seguras em renderizações concorrentes, mas sua API se mostrou difícil de usar corretamente e nunca foi lançada como estável.

A equipe do React a substituiu por uma primitiva mais simples e ergonômica, que oferece as mesmas garantias de consistência sem essas limitações.

useSyncExternalStore como solução

useSyncExternalStore é o gancho oficial para se inscrever em armazenamentos externos de forma segura em renderizações concorrentes. Ele coordena o trabalho com o React para que as leituras permaneçam consistentes durante uma renderização e os componentes nunca sofram fragmentação.

Ele se tornou a primitiva recomendada para autores de bibliotecas que precisam integrar de forma confiável estados externos ao React durante renderizações concorrentes.

Quais bibliotecas foram afetadas

Bibliotecas de estado que se inscrevem em armazenamentos externos foram diretamente afetadas, incluindo Redux, MobX e Valtio. Cada uma precisou adotar a nova primitiva para continuar segura quando os recursos concorrentes foram lançados.

Por isso, suas integrações com o React foram atualizadas para chamar useSyncExternalStore internamente, em vez de depender do padrão mais antigo que combina useState com useEffect.

Instantâneo consistente e segurança na renderização concorrente

O gancho garante que todo componente que leia o armazenamento durante uma renderização veja o mesmo instantâneo e força uma nova renderização síncrona se o armazenamento mudar de uma forma que, de outro modo, causaria uma inconsistência de leitura.

Essa combinação de um instantâneo consistente e segurança na renderização concorrente é o principal valor que o gancho oferece em comparação com inscrições implementadas manualmente.

Um primitivo preparado para o futuro

Ao usar useSyncExternalStore, suas inscrições continuam corretas à medida que o React evolui seu modelo de renderização. Você adota as garantias da estrutura em vez de reimplementá-las de forma imperfeita.

Isso faz dele a maneira duradoura e recomendada de conectar qualquer fonte externa de dados a componentes do React.

Verificação rápida: o problema da inconsistência de leitura

Confirme o significado de inconsistência de leitura na renderização concorrente.

Recapitulação: problemas das inscrições em armazenamentos externos

Os armazenamentos externos ficam fora do React, e a inscrição ingênua usando useState e useEffect não consegue evitar inconsistências de leitura quando a renderização se torna concorrente. Os efeitos são executados tarde demais para manter as leituras consistentes dentro de uma renderização.

useSyncExternalStore substitui o useMutableSource abandonado e oferece um instantâneo consistente com segurança na renderização concorrente. Bibliotecas como Redux, MobX e Valtio o adotaram como o primitivo preparado para o futuro para inscrições em armazenamentos.

Perguntas Frequentes

A aula “O Problema das Assinaturas em Armazenamentos Externos” é grátis?

Sim — o texto completo de “O Problema das Assinaturas em Armazenamentos Externos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.

O que vou aprender em “O Problema das Assinaturas em Armazenamentos Externos”?

Compreenda o tearing e por que as assinaturas com useState ou useRef em armazenamentos externos não são seguras no React concorrente. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar React Academy?

Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “O Problema das Assinaturas em Armazenamentos Externos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de React Academy?

Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O Problema das Assinaturas em Armazenamentos Externos
  2. API e Parâmetros de useSyncExternalStore
  3. Assinando APIs do Navegador
  4. Construindo um Armazenamento Personalizado com useSyncExternalStore
← Voltar para React Academy