restate / v1.0.0

Questions fréquentes

Réponses aux questions courantes sur le rendu, l’enregistrement, les scopes et les erreurs dans restate.

BasesAi-je besoin d’un Provider ?

Non. Un store est une valeur au niveau du module ; tout composant qui l’importe peut l’utiliser. Utilisez useRestateScope quand l’état doit appartenir à une instance de composant.

BasesPourquoi mon composant se rend-il à chaque changement ?

Appeler le hook sans selector abonne à la valeur entière. Passez un selector qui ne renvoie que ce que le composant affiche.

BasesMon selector renvoie un objet et se rend à chaque fois.

Un nouvel objet n’est jamais égal au précédent selon Object.is. Passez shallow en second argument, ou sélectionnez les champs séparément.

BasesJ’ai modifié un objet mais rien ne s’est mis à jour.

set a reçu le même objet, donc restate n’a vu aucun changement. Renvoyez un nouvel objet ou tableau depuis set.

EnregistrementOù attendre les données enregistrées ?

Une seule fois, au point d’entrée client : faites await restateManager.ready avant de rendre l’application. Les composants lisent ensuite directement les valeurs enregistrées. Les stores d’un useRestateScope attendent leur propre scope.manager.ready.

EnregistrementQuand les données sont-elles écrites dans le stockage ?

Seulement quand vous appelez save(), ou après les changements si autoSave est activé. Modifier change la mémoire ; status().dirty vous indique qu’il reste des modifications non enregistrées.

EnregistrementFaut-il utiliser autoSave ou save() ?

Utilisez autoSave pour les réglages et brouillons qui doivent toujours persister. Utilisez save() quand c’est l’utilisateur qui décide, avec un bouton Enregistrer ou l’envoi d’un formulaire. Vous pouvez appeler save() même avec autoSave activé, par exemple sur pagehide.

EnregistrementL’enregistrement échoue en navigation privée ou pendant le SSR.

Quand le stockage est indisponible, le store continue de fonctionner en mémoire, status().available vaut false et save() est rejeté avec STORAGE_UNAVAILABLE. Le démarrage réussit malgré tout.

ErreursrestateManager.ready a été rejeté. Que faire ?

Il est rejeté avec BULK_OPERATION_FAILED quand un enregistrement n’a pas pu être lu, migré ou validé. error.failures indique chaque store et son erreur. Corrigez ou effacez l’enregistrement, appelez l’initialize() de ce store, puis accédez de nouveau à ready.

ErreursJ’obtiens QUEUE_FULL ou STORAGE_TIMEOUT.

Le stockage est plus lent que le travail que vous mettez en file. Évitez d’appeler save() dans une boucle serrée — un enregistrement en attente prend déjà la valeur la plus récente — ou utilisez autoSave avec un délai. Ajustez maxPendingOperations et operationTimeoutMs si besoin.

ErreursUne requête tardive écrit dans un store après le démontage.

set() et reset() sur un store détruit sont ignorés, comme une mise à jour d’état React après démontage. S’abonner lève STORE_DESTROYED et les commandes de stockage sont rejetées.

ScopesMon store avec scope ignore les nouvelles props.

La factory s’exécute une fois, comme l’initialiseur de useState. Rendez le composant avec une key par document pour qu’un nouveau document obtienne un nouveau scope.

ScopesComment éviter les incohérences d’hydratation ?

Passez les mêmes données serveur en props côté serveur et côté client, et créez le store à partir d’elles dans useRestateScope. La valeur initiale devient le snapshot serveur.

ScopesPourquoi mon store avec scope n’est-il pas dans restateManager.ready ?

Les stores enregistrés d’un scope commencent à charger après la validation du composant propriétaire côté client. Attendez scope.manager.ready dans une frontière de chargement à l’intérieur de ce composant.

EnregistrementMMKV_UNAVAILABLE sur React Native.

Installez react-native-mmkv et ses dépendances natives, puis recompilez l’application. Avec Expo, utilisez un development build. Les stores en mémoire fonctionnent sans MMKV.

Rechercher dans la documentation

Recherche dans les titres, les descriptions et le texte de tous les guides.