restate / v1.0.0

Mentsen, amikor eldönti

Tartsa a store-t IndexedDB-ben vagy MMKV-ben, töltse be egyszer induláskor, mentsen kifejezetten vagy automatikusan, és jelenítse meg a nem mentett változásokat.

Ezen az oldalonMentett store deklarálásaVárjon egyszer induláskorMentés, visszavonás és visszaállításA nem mentett változások és a folyamat megjelenítésePróbálja kiAutomatikus mentésAz oldal bezárása előttTárolóhibák kezelése

Mentett store deklarálása

Cserélje a restate-et persistedRestate-re, és adjon meg neki egy key-t. A komponensek továbbra is ugyanazt a hookot és ugyanazt a set-et használják.

A mentett érték a létrehozás után automatikusan helyreáll. A szerkesztés a memóriát módosítja; semmi nem íródik ki, amíg nem ment, vagy be nem kapcsolja az autoSave-et.

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

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

Várjon egyszer induláskor

A kliens belépési pontján importálja az alkalmazást és a store-jait, majd renderelés előtt várjon a restateManager.ready-re. Onnantól a komponensek közvetlenül olvashatják a mentett értékeket.

Az elérhetetlen tároló, például szerveroldali renderelésnél vagy egy azt letiltó böngészőben, nem hiba: az ilyen store-ok a memóriában futnak. A ready csak akkor utasul el, ha a rekordokat nem lehet beolvasni, migrálni vagy ellenőrizni.

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

Mentés, visszavonás és visszaállítás

A save kiírja az aktuális értéket, a restore visszaáll a mentett értékre, a resetAll pedig törli a memóriát és a tárolót is. Mindegyik Promise-t ad vissza.

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

A nem mentett változások és a folyamat megjelenítése

A useStatus újrarenderel, amikor a mentés állapota változik. A dirty értéke true, amíg a memória eltér az utoljára betöltött, mentett vagy helyreállított értéktől. Az operation az aktuális tárolóművelet nevét adja meg.

Adjon át egy selectort, hogy csak egyetlen mező változásakor rendereljen újra.

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

Próbálja ki

Gépeljen, növelje a tároló késleltetését, és mentsen. Játssza újra a példát, hogy lássa a helyreállított piszkozatot.

A példa előkészítése…

Automatikus mentés

Kapcsolja be egyszer azokhoz a beállításokhoz és piszkozatokhoz, amelyeket mindig menteni kell. Az autoSave: true minden változás után ment; a { delayMs } megvárja, amíg a változások abbamaradnak.

Változások sorozatából egyetlen írás lesz, a mentett értékhez való visszatérés pedig semmit nem ír. A hibák a status().error mezőben jelennek meg. Egy komponens scope-ja leválasztáskor kiírja a függő változást.

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

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

Az oldal bezárása előtt

Olvassa ugyanazt az állapotot a Reacten kívül. Figyelmeztessen távozás előtt a nem mentett változásokra, vagy mentsen mindent, amikor az oldal elrejtődik.

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

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

Tárolóhibák kezelése

A tárolóhibák elutasítják a művelet Promise-át. Minden restate-hibának van code mezője, mentett store-nál pedig a rekord key-e is.

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

Keresés a dokumentációban

Keresés az összes útmutató címében, leírásában és szövegében.