restate / v1.0.0

Ukladajte, keď sa rozhodnete

Uchovajte store v IndexedDB alebo MMKV, načítajte ho raz pri spustení, ukladajte explicitne či automaticky a zobrazujte neuložené úpravy.

Na tejto stránkeDeklarácia ukladaného storePočkajte raz pri spusteníUložiť, vrátiť a obnoviť predvolenéZobrazenie neuložených úprav a priebehuVyskúšajteAutomatické ukladaniePred zatvorením stránkyOšetrenie chýb úložiska

Deklarácia ukladaného store

Nahraďte restate za persistedRestate a dajte mu key. Komponenty ďalej používajú rovnaký hook a rovnaké set.

Uložená hodnota sa po vytvorení obnoví automaticky. Úprava mení pamäť; nič sa nezapíše, kým neuložíte alebo nezapnete autoSave.

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

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

Počkajte raz pri spustení

Vo vstupnom bode klienta naimportujte aplikáciu a jej store a pred renderom počkajte na restateManager.ready. Odvtedy môžu komponenty uložené hodnoty čítať priamo.

Nedostupné úložisko, napríklad pri renderovaní na serveri alebo v prehliadači, ktorý ho blokuje, nie je chyba: také store fungujú v pamäti. ready sa odmietne, len keď záznamy nejde prečítať, migrovať alebo validovať.

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žiť, vrátiť a obnoviť predvolené

save zapíše aktuálnu hodnotu, restore sa vráti k uloženej hodnote a resetAll vymaže pamäť aj úložisko. Každá vracia 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

Zobrazenie neuložených úprav a priebehu

useStatus sa prekreslí, keď sa zmení stav ukladania. dirty je true, kým sa pamäť líši od naposledy načítanej, uloženej alebo obnovenej hodnoty. operation pomenúva prebiehajúcu operáciu s úložiskom.

Odovzdajte selector, aby sa prekresľovalo len pri zmene jedného poľa.

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

Vyskúšajte

Píšte, zvýšte latenciu úložiska a uložte. Prehrajte príklad znova a uvidíte obnovený koncept.

Príprava príkladu…

Automatické ukladanie

Pre nastavenia a koncepty, ktoré sa majú ukladať vždy, ho raz zapnite. autoSave: true ukladá po každej zmene; { delayMs } počká, kým úpravy ustanú.

Séria úprav sa zmení na jeden zápis a návrat k uloženej hodnote nezapíše nič. Chyby sa objavia v status().error. Scope komponentu pri odpojení zapíše čakajúcu úpravu.

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

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

Pred zatvorením stránky

Čítajte rovnaký stav mimo React. Upozornite pred odchodom, ak existujú neuložené úpravy, alebo všetko uložte, keď sa stránka skryje.

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

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

Ošetrenie chýb úložiska

Chyby úložiska odmietnu Promise operácie. Každá chyba restate má code a pri ukladaných store aj 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'}".`);
}

Hľadať v dokumentácii

Hľadajte v nadpisoch, popisoch a texte všetkých sprievodcov.