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'}".`);
}

Пошук у документації

Пошук у заголовках, описах і тексті всіх посібників.