restate / v1.0.0

Сохраняйте, когда решите

Храните хранилище в IndexedDB или MMKV, загружайте его один раз при запуске, сохраняйте явно или автоматически и показывайте несохранённые правки.

На этой страницеОбъявление сохраняемого хранилищаОжидание один раз при запускеСохранение, отмена и сбросПоказ несохранённых правок и хода сохраненияПопробуйтеАвтоматическое сохранениеПеред закрытием страницыОбработка ошибок хранилища

Объявление сохраняемого хранилища

Замените restate на persistedRestate и задайте key. Компоненты продолжают использовать тот же хук и тот же set.

Сохранённое значение восстанавливается автоматически после создания. Правка меняет память; ничего не записывается, пока вы не сохраните или не включите autoSave.

JavaScript / JSX
import { persistedRestate } from '@kkwaenggwari/restate';

export const useDraft = persistedRestate('', {
  key: 'article-draft',
  validate: (value) => typeof value === 'string',
});

Ожидание один раз при запуске

В клиентской точке входа импортируйте приложение и его хранилища, затем дождитесь restateManager.ready перед рендером. После этого компоненты могут сразу читать сохранённые значения.

Недоступное хранилище — например, при рендеринге на сервере или в браузере, который его блокирует, — не ошибка: такие хранилища работают в памяти. ready отклоняется, только когда записи нельзя прочитать, мигрировать или проверить.

JavaScript / JSX
import { createRoot } from 'react-dom/client';
import { restateManager } from '@kkwaenggwari/restate';
import App from './App';

async function start() {
  const root = createRoot(document.getElementById('root'));
  try {
    await restateManager.ready;
    root.render(<App />);
  } catch (error) {
    root.render(<p>Could not load saved data.</p>);
    console.error(error);
  }
}
start();

Сохранение, отмена и сброс

save записывает текущее значение, restore возвращает сохранённое, а resetAll очищает и память, и хранилище. Каждый возвращает Promise.

JavaScript / JSX
await useDraft.save(); // write the current value
await useDraft.restore(); // return to the saved value
await useDraft.resetAndClearStorage(); // initial value in memory, record removed

Показ несохранённых правок и хода сохранения

useStatus перерисовывается, когда меняется статус сохранения. dirty равно true, пока память отличается от последнего загруженного, сохранённого или восстановленного значения. operation называет текущую операцию с хранилищем.

Передайте selector, чтобы перерисовывать только при изменении одного поля.

JavaScript / JSX
function SaveButton() {
  const { dirty, operation, error } = useDraft.useStatus();
  const saving = operation === 'save';

  return (
    <>
      <button disabled={!dirty || saving} onClick={() => useDraft.save().catch(() => {})}>
        {saving ? 'Saving…' : 'Save'}
      </button>
      {error != null && <p>Could not save your draft.</p>}
    </>
  );
}

Попробуйте

Печатайте, увеличьте задержку хранилища и сохраните. Повторите пример, чтобы увидеть восстановленный черновик.

Подготовка примера…

Автоматическое сохранение

Для настроек и черновиков, которые всегда должны сохраняться, включите его один раз. autoSave: true сохраняет после каждого изменения; { delayMs } ждёт, пока правки прекратятся.

Серия правок превращается в одну запись, а возврат к сохранённому значению ничего не пишет. Ошибки появляются в status().error. Область компонента записывает ожидающую правку при размонтировании.

JavaScript / JSX
export const useTheme = persistedRestate('light', { key: 'theme', autoSave: true });

export const useDraft = persistedRestate('', {
  key: 'article-draft',
  autoSave: { delayMs: 500 },
});

Перед закрытием страницы

Читайте то же состояние вне React. Предупреждайте перед уходом, если есть несохранённые правки, или сохраняйте всё, когда страница скрывается.

JavaScript / JSX
window.addEventListener('beforeunload', (event) => {
  if (useDraft.status().dirty) event.preventDefault();
});

window.addEventListener('pagehide', () => {
  restateManager.saveAll();
});

Обработка ошибок хранилища

Ошибки хранилища отклоняют Promise операции. У каждой ошибки restate есть code, а у сохраняемых хранилищ — ещё и key записи.

JavaScript / JSX
try {
  await useDraft.save();
} catch (error) {
  if (error.code === 'STORAGE_UNAVAILABLE') showNotice('Saving is off in this browser.');
  else if (error.code === 'STORAGE_VALUE_TOO_LARGE') showNotice('This draft is too large.');
  else showNotice(`Could not save "${error.key ?? 'draft'}".`);
}

Поиск по документации

Поиск по заголовкам, описаниям и тексту всех руководств.