restate / v1.0.0

Spara när du bestämmer

Spara en store i IndexedDB eller MMKV, läs in den en gång vid start, spara explicit eller automatiskt och visa osparade ändringar.

På den här sidanDeklarera en sparad storeVänta en gång vid startSpara, ångra och återställVisa osparade ändringar och förloppProvaSpara automatisktInnan sidan stängsHantera lagringsfel

Deklarera en sparad store

Byt restate mot persistedRestate och ge den en key. Komponenterna använder fortfarande samma hook och samma set.

Det sparade värdet återställs automatiskt efter att storen skapats. Att redigera ändrar minnet; ingenting skrivs förrän du sparar eller slår på autoSave.

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

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

Vänta en gång vid start

Importera appen och dess stores i klientens startpunkt och vänta sedan på restateManager.ready innan du renderar. Därefter kan komponenterna läsa sparade värden direkt.

Otillgänglig lagring, som vid serverrendering eller i en webbläsare som blockerar den, är inget fel: de storesen fungerar i minnet. ready avvisas bara när poster inte kan läsas, migreras eller valideras.

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

Spara, ångra och återställ

save skriver det aktuella värdet, restore går tillbaka till det sparade värdet och resetAll rensar både minne och lagring. Var och en returnerar ett 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

Visa osparade ändringar och förlopp

useStatus renderas om när sparstatusen ändras. dirty är true så länge minnet skiljer sig från det senast inlästa, sparade eller återställda värdet. operation namnger den pågående lagringsåtgärden.

Skicka en selector för att bara rendera om när ett fält ändras.

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

Prova

Skriv, öka lagringsfördröjningen och spara. Spela upp exemplet igen för att se det sparade utkastet återställt.

Förbereder exemplet…

Spara automatiskt

Slå på det en gång för inställningar och utkast som alltid ska sparas. autoSave: true sparar efter varje ändring; { delayMs } väntar tills ändringarna upphör.

En serie ändringar blir en skrivning, och att gå tillbaka till det sparade värdet skriver ingenting. Fel syns i status().error. Ett komponentscope skriver den väntande ändringen vid unmount.

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

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

Innan sidan stängs

Läs samma state utanför React. Varna innan användaren lämnar om det finns osparade ändringar, eller spara allt när sidan döljs.

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

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

Hantera lagringsfel

Lagringsfel avvisar åtgärdens Promise. Varje restate-fel har en code och, för sparade 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 dokumentationen

Sök i rubriker, beskrivningar och text i alla guider.