restate / v1.0.0

Tallenna, kun päätät

Pidä store IndexedDB:ssä tai MMKV:ssä, lataa se kerran käynnistyksessä, tallenna nimenomaisesti tai automaattisesti ja näytä tallentamattomat muutokset.

Tällä sivullaTallennetun storen määrittelyOdota kerran käynnistyksessäTallennus, kumoaminen ja nollausTallentamattomien muutosten ja etenemisen näyttäminenKokeileAutomaattitallennusEnnen sivun sulkemistaTallennusvirheiden käsittely

Tallennetun storen määrittely

Vaihda restate tilalle persistedRestate ja anna sille key. Komponentit käyttävät edelleen samaa hookia ja samaa setiä.

Tallennettu arvo palautuu automaattisesti luomisen jälkeen. Muokkaaminen muuttaa muistia; mitään ei kirjoiteta ennen kuin tallennat tai otat autoSaven käyttöön.

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

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

Odota kerran käynnistyksessä

Importtaa asiakkaan aloituspisteessä sovellus ja sen storet ja odota sitten restateManager.ready-arvoa ennen renderöintiä. Siitä eteenpäin komponentit voivat lukea tallennetut arvot suoraan.

Käyttämätön tallennustila, kuten palvelinrenderöinnissä tai sen estävässä selaimessa, ei ole virhe: tällaiset storet toimivat muistissa. ready hylätään vain, kun tietueita ei voida lukea, siirtää tai validoida.

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

Tallennus, kumoaminen ja nollaus

save kirjoittaa nykyisen arvon, restore palaa tallennettuun arvoon ja resetAll tyhjentää sekä muistin että tallennustilan. Kukin palauttaa Promisen.

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

Tallentamattomien muutosten ja etenemisen näyttäminen

useStatus renderöityy uudelleen, kun tallennustila muuttuu. dirty on true niin kauan kuin muisti poikkeaa viimeksi ladatusta, tallennetusta tai palautetusta arvosta. operation nimeää käynnissä olevan tallennustoiminnon.

Anna selector, jotta renderöinti tapahtuu vain yhden kentän muuttuessa.

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

Kokeile

Kirjoita, kasvata tallennustilan viivettä ja tallenna. Toista esimerkki uudelleen nähdäksesi palautetun luonnoksen.

Valmistellaan esimerkkiä…

Automaattitallennus

Ota se kerran käyttöön asetuksille ja luonnoksille, jotka on aina tallennettava. autoSave: true tallentaa jokaisen muutoksen jälkeen; { delayMs } odottaa, kunnes muutokset loppuvat.

Muutossarjasta tulee yksi kirjoitus, ja paluu tallennettuun arvoon ei kirjoita mitään. Virheet näkyvät status().error-kentässä. Komponentin scope kirjoittaa odottavan muutoksen irrottamisen yhteydessä.

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

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

Ennen sivun sulkemista

Lue sama tila Reactin ulkopuolella. Varoita tallentamattomista muutoksista ennen poistumista tai tallenna kaikki, kun sivu piilotetaan.

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

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

Tallennusvirheiden käsittely

Tallennusvirheet hylkäävät toiminnon Promisen. Jokaisella restate-virheellä on code, ja tallennetuissa storeissa myös tietueen 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'}".`);
}

Hae dokumentaatiosta

Hae kaikkien oppaiden otsikoista, kuvauksista ja sisällöstä.