restate / v1.0.0
Частые вопросы
Ответы на самые частые вопросы о рендеринге, сохранении, областях и ошибках в restate.
Подходящих вопросов нет
Попробуйте другое слово или покажите все вопросы.
ОсновыНужен ли мне Provider?
Нет. Хранилище — значение уровня модуля; его может использовать любой компонент, который его импортирует. Используйте useRestateScope, когда состояние должно принадлежать экземпляру компонента.
ОсновыПочему мой компонент перерисовывается при каждом изменении?
Вызов хука без selector подписывает на всё значение. Передайте selector, который возвращает только то, что показывает компонент.
ОсновыМой selector возвращает объект и перерисовывается каждый раз.
Новый объект никогда не равен предыдущему по Object.is. Передайте shallow вторым аргументом или выбирайте поля по отдельности.
ОсновыОбъект изменился, но ничего не обновилось.
set получил тот же объект, поэтому restate не увидел изменений. Возвращайте из set новый объект или массив.
СохранениеГде дожидаться сохранённых данных?
Один раз, в клиентской точке входа: выполните await restateManager.ready перед рендером приложения. После этого компоненты сразу читают сохранённые значения. Хранилища в useRestateScope ждут собственный scope.manager.ready.
СохранениеКогда данные записываются в хранилище?
Только когда вы вызываете save() или, если включён autoSave, после изменений. Правка меняет память; status().dirty сообщает, что есть несохранённые изменения.
СохранениеautoSave или save()?
Используйте autoSave для настроек и черновиков, которые всегда должны сохраняться. Используйте save(), когда решает пользователь — кнопкой «Сохранить» или отправкой формы. save() можно вызывать и при включённом autoSave, например на pagehide.
ОшибкиrestateManager.ready отклонён. Что делать?
Он отклоняется с BULK_OPERATION_FAILED, когда запись не удалось прочитать, мигрировать или проверить. error.failures перечисляет каждое хранилище и его ошибку. Исправьте или очистите запись, вызовите initialize() этого хранилища и снова обратитесь к ready.
ОшибкиЯ вижу QUEUE_FULL или STORAGE_TIMEOUT.
Хранилище медленнее, чем работа, которую вы ставите в очередь. Не вызывайте save() в плотном цикле — ожидающее сохранение и так берёт самое свежее значение — или используйте autoSave с ожиданием. При необходимости настройте maxPendingOperations и operationTimeoutMs.
ОшибкиЗапоздавший запрос пишет в хранилище после размонтирования.
set() и reset() на уничтоженном хранилище игнорируются — как обновление состояния React после размонтирования. Подписка выбрасывает STORE_DESTROYED, а команды хранилища отклоняются.
ОбластиМоё хранилище в области игнорирует новые props.
Фабрика выполняется один раз, как инициализатор useState. Рендерите компонент с key для каждого документа, чтобы у каждого нового документа была новая область.
ОбластиКак избежать расхождений при гидратации?
Передавайте одни и те же серверные данные как props на сервере и на клиенте и создавайте из них хранилище в useRestateScope. Начальное значение становится серверным снимком.
ОбластиПочему моего хранилища из области нет в restateManager.ready?
Сохраняемые хранилища в области начинают загрузку после коммита компонента-владельца на клиенте. Дожидайтесь scope.manager.ready внутри границы загрузки в этом компоненте.
СохранениеMMKV_UNAVAILABLE в React Native.
Установите react-native-mmkv и его нативные зависимости, затем пересоберите приложение. В Expo используйте development build. Хранилища в памяти работают без MMKV.