restate / v1.0.0

Lagre når du bestemmer

Ta vare på en store i IndexedDB eller MMKV, last den inn én gang ved oppstart, lagre eksplisitt eller automatisk, og vis ulagrede endringer.

På denne sidenDeklarer en lagret storeVent én gang ved oppstartLagre, angre og tilbakestillVis ulagrede endringer og fremdriftPrøv detLagre automatiskFør siden lukkesHåndter lagringsfeil

Deklarer en lagret store

Bytt restate med persistedRestate og gi den en key. Komponentene bruker fortsatt samme hook og samme set.

Den lagrede verdien gjenopprettes automatisk etter at storen er opprettet. Redigering endrer minnet; ingenting skrives før du lagrer eller slår på autoSave.

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

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

Vent én gang ved oppstart

Importer appen og storene dens i klientens inngangspunkt, og vent deretter på restateManager.ready før du renderer. Derfra kan komponentene lese lagrede verdier direkte.

Utilgjengelig lagring, som ved serverrendering eller i en nettleser som blokkerer den, er ikke en feil: de storene kjører i minnet. ready avvises bare når poster ikke kan leses, migreres eller valideres.

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

Lagre, angre og tilbakestill

save skriver gjeldende verdi, restore går tilbake til den lagrede verdien, og resetAll tømmer både minnet og lagringen. Hver returnerer et 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

Vis ulagrede endringer og fremdrift

useStatus renderes på nytt når lagringsstatusen endres. dirty er true så lenge minnet avviker fra den sist innlastede, lagrede eller gjenopprettede verdien. operation angir den pågående lagringsoperasjonen.

Send en selector for bare å rendere på nytt når ett felt endres.

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øv det

Skriv, øk lagringsforsinkelsen og lagre. Spill av eksempelet igjen for å se det lagrede utkastet gjenopprettet.

Forbereder eksempelet …

Lagre automatisk

Slå det på én gang for innstillinger og utkast som alltid skal lagres. autoSave: true lagrer etter hver endring; { delayMs } venter til endringene stopper.

En rekke endringer blir til én skriving, og å gå tilbake til den lagrede verdien skriver ingenting. Feil vises i status().error. Et komponent-scope skriver den ventende endringen ved unmount.

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

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

Før siden lukkes

Les den samme state-en utenfor React. Advar før brukeren forlater siden hvis det finnes ulagrede endringer, eller lagre alt når siden skjules.

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

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

Håndter lagringsfeil

Lagringsfeil avviser operasjonens Promise. Hver restate-feil har en code og, for lagrede stores, postens 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'}".`);
}

Søk i dokumentasjonen

Søk i titler, beskrivelser og tekst i alle guider.