restate / v1.0.0

Speichern, wann du willst

Bewahre einen Store in IndexedDB oder MMKV auf, lade ihn einmal beim Start, speichere explizit oder automatisch und zeige ungespeicherte Änderungen an.

Auf dieser SeiteEinen gespeicherten Store deklarierenEinmal beim Start wartenSpeichern, verwerfen und zurücksetzenUngespeicherte Änderungen und Fortschritt anzeigenAusprobierenAutomatisch speichernBevor die Seite geschlossen wirdSpeicherfehler behandeln

Einen gespeicherten Store deklarieren

Ersetze restate durch persistedRestate und gib ihm einen key. Komponenten nutzen weiter denselben Hook und dasselbe set.

Der gespeicherte Wert wird nach dem Erstellen automatisch wiederhergestellt. Bearbeiten ändert den Arbeitsspeicher; geschrieben wird erst, wenn du speicherst oder autoSave einschaltest.

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

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

Einmal beim Start warten

Importiere am Client-Einstiegspunkt die App und ihre Stores und warte vor dem Rendern auf restateManager.ready. Danach können Komponenten gespeicherte Werte direkt lesen.

Nicht verfügbarer Speicher, etwa beim Server-Rendering oder in einem Browser, der ihn blockiert, ist kein Fehler: Diese Stores arbeiten im Arbeitsspeicher. ready wird nur abgelehnt, wenn Datensätze nicht gelesen, migriert oder validiert werden können.

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

Speichern, verwerfen und zurücksetzen

save schreibt den aktuellen Wert, restore kehrt zum gespeicherten Wert zurück und resetAll leert Arbeitsspeicher und Speicher. Jede Methode gibt eine Promise zurück.

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

Ungespeicherte Änderungen und Fortschritt anzeigen

useStatus rendert neu, wenn sich der Persistenzstatus ändert. dirty ist true, solange sich der Arbeitsspeicher vom zuletzt geladenen, gespeicherten oder wiederhergestellten Wert unterscheidet. operation nennt die laufende Speicheroperation.

Übergib einen selector, um nur bei Änderung eines Felds neu zu rendern.

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

Ausprobieren

Tipp, erhöhe die Speicherlatenz und speichere. Spiel das Beispiel erneut ab, um den gespeicherten Entwurf wiederhergestellt zu sehen.

Beispiel wird vorbereitet…

Automatisch speichern

Für Einstellungen und Entwürfe, die immer erhalten bleiben sollen, reicht ein einmaliges Opt-in. autoSave: true speichert nach jeder Änderung; { delayMs } wartet, bis die Änderungen pausieren.

Viele schnelle Änderungen werden zu einem Schreibvorgang, und eine Rückkehr zum gespeicherten Wert schreibt nichts. Fehler erscheinen in status().error. Ein komponenteneigener Scope schreibt eine ausstehende Änderung, wenn er unmountet.

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

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

Bevor die Seite geschlossen wird

Lies denselben Status außerhalb von React. Warne vor dem Verlassen bei ungespeicherten Änderungen oder speichere alles, wenn die Seite ausgeblendet wird.

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

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

Speicherfehler behandeln

Speicherfehler lehnen die Promise der Operation ab. Jeder restate-Fehler hat einen code und bei gespeicherten Stores den key des Datensatzes.

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

Doku durchsuchen

Durchsucht Titel, Beschreibungen und Text aller Guides.