restate / v1.0.0

Perguntas frequentes

Respostas para dúvidas comuns sobre renderização, salvamento, scopes e erros no restate.

BásicoPreciso de um Provider?

Não. Um store é um valor no nível do módulo; qualquer componente que o importe pode usá-lo. Use useRestateScope quando o estado deve pertencer a uma instância de componente.

BásicoPor que meu componente renderiza a cada mudança?

Chamar o hook sem selector assina o valor inteiro. Passe um selector que retorne só o que o componente mostra.

BásicoMeu selector retorna um objeto e renderiza toda vez.

Um objeto novo nunca é igual ao anterior por Object.is. Passe shallow como segundo argumento ou selecione os campos separadamente.

BásicoMudei um objeto, mas nada foi atualizado.

set recebeu o mesmo objeto, então o restate não viu mudança. Retorne um objeto ou array novo em set.

SalvamentoOnde eu espero os dados salvos?

Uma vez, na entrada do cliente: faça await restateManager.ready antes de renderizar o app. Depois, os componentes leem os valores salvos diretamente. Stores em um useRestateScope esperam o próprio scope.manager.ready.

SalvamentoQuando os dados são gravados no armazenamento?

Só quando você chama save() ou, com autoSave ligado, depois das mudanças. Editar muda a memória; status().dirty avisa que há alterações não salvas.

SalvamentoDevo usar autoSave ou save()?

Use autoSave para configurações e rascunhos que devem persistir sempre. Use save() quando o usuário decide, como em um botão Salvar ou no envio de um formulário. Dá para chamar save() mesmo com autoSave ligado, por exemplo em pagehide.

SalvamentoO salvamento falha em janela anônima ou durante o SSR.

Quando o armazenamento está indisponível, o store continua funcionando em memória, status().available é false e save() é rejeitado com STORAGE_UNAVAILABLE. A inicialização funciona mesmo assim.

ErrosrestateManager.ready foi rejeitado. E agora?

Ele é rejeitado com BULK_OPERATION_FAILED quando um registro não pôde ser lido, migrado ou validado. error.failures lista cada store e o erro dele. Corrija ou limpe o registro, chame o initialize() desse store e acesse ready de novo.

ErrosAparece QUEUE_FULL ou STORAGE_TIMEOUT.

O armazenamento está mais lento que o trabalho que você enfileira. Evite chamar save() em um loop apertado — um salvamento na fila já pega o valor mais recente — ou use autoSave com espera. Ajuste maxPendingOperations e operationTimeoutMs se precisar.

ErrosUma requisição atrasada grava em um store depois da desmontagem.

set() e reset() em um store destruído são ignorados, como uma atualização de estado do React depois da desmontagem. Assinar lança STORE_DESTROYED e os comandos de armazenamento são rejeitados.

ScopesMeu store com scope ignora props novas.

A factory roda uma vez, como um inicializador de useState. Renderize o componente com uma key por documento para que cada documento novo ganhe um scope novo.

ScopesComo evito diferenças na hidratação?

Passe os mesmos dados do servidor como props no servidor e no cliente, e crie o store a partir deles em useRestateScope. O valor inicial vira o snapshot do servidor.

ScopesPor que meu store com scope não está em restateManager.ready?

Stores salvos com scope começam a carregar depois que o componente dono é confirmado no cliente. Espere scope.manager.ready em um limite de carregamento dentro desse componente.

SalvamentoMMKV_UNAVAILABLE no React Native.

Instale react-native-mmkv e as dependências nativas dele e recompile o app. No Expo, use uma development build. Stores em memória funcionam sem MMKV.

Pesquisar na documentação

Pesquisa em títulos, descrições e texto de todos os guias.