restate / v1.0.0

Ukládejte, když se rozhodnete

Uchovejte store v IndexedDB nebo MMKV, načtěte ho jednou při spuštění, ukládejte explicitně či automaticky a zobrazujte neuložené úpravy.

Na této stránceDeklarace ukládaného storePočkejte jednou při spuštěníUložit, vrátit a obnovit výchozíZobrazení neuložených úprav a průběhuVyzkoušejteAutomatické ukládáníPřed zavřením stránkyOšetření chyb úložiště

Deklarace ukládaného store

Nahraďte restate za persistedRestate a dejte mu key. Komponenty dál používají stejný hook a stejné set.

Uložená hodnota se po vytvoření obnoví automaticky. Úprava mění paměť; nic se nezapíše, dokud neuložíte nebo nezapnete autoSave.

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

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

Počkejte jednou při spuštění

Ve vstupním bodu klienta naimportujte aplikaci a její story a před renderem počkejte na restateManager.ready. Od té chvíle mohou komponenty uložené hodnoty číst přímo.

Nedostupné úložiště, například při renderování na serveru nebo v prohlížeči, který ho blokuje, není chyba: takové story fungují v paměti. ready se odmítne, jen když záznamy nejde přečíst, migrovat nebo validovat.

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();

Uložit, vrátit a obnovit výchozí

save zapíše aktuální hodnotu, restore se vrátí k uložené hodnotě a resetAll vymaže paměť i úložiště. Každá vrací 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

Zobrazení neuložených úprav a průběhu

useStatus se překreslí, když se změní stav ukládání. dirty je true, dokud se paměť liší od naposledy načtené, uložené nebo obnovené hodnoty. operation pojmenovává probíhající operaci s úložištěm.

Předejte selector, aby se překreslovalo jen při změně jednoho pole.

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>}
    </>
  );
}

Vyzkoušejte

Pište, zvyšte latenci úložiště a uložte. Přehrajte příklad znovu a uvidíte obnovený koncept.

Příprava příkladu…

Automatické ukládání

Pro nastavení a koncepty, které se mají ukládat vždy, ho jednou zapněte. autoSave: true ukládá po každé změně; { delayMs } počká, až úpravy ustanou.

Série úprav se změní v jeden zápis a návrat k uložené hodnotě nezapíše nic. Chyby se objeví v status().error. Scope komponenty při odpojení zapíše čekající úpravu.

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

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

Před zavřením stránky

Čtěte stejný stav mimo React. Upozorněte před odchodem, pokud existují neuložené úpravy, nebo vše uložte, když se stránka skryje.

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

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

Ošetření chyb úložiště

Chyby úložiště odmítnou Promise operace. Každá chyba restate má code a u ukládaných store také key záznamu.

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

Hledat v dokumentaci

Hledejte v nadpisech, popisech a textu všech průvodců.