restate / v1.0.0
Ukladajte, keď sa rozhodnete
Uchovajte store v IndexedDB alebo MMKV, načítajte ho raz pri spustení, ukladajte explicitne či automaticky a zobrazujte neuložené úpravy.
Na tejto stránke
Deklarácia ukladaného storePočkajte raz pri spusteníUložiť, vrátiť a obnoviť predvolenéZobrazenie neuložených úprav a priebehuVyskúšajteAutomatické ukladaniePred zatvorením stránkyOšetrenie chýb úložiskaDeklarácia ukladaného store
Nahraďte restate za persistedRestate a dajte mu key. Komponenty ďalej používajú rovnaký hook a rovnaké set.
Uložená hodnota sa po vytvorení obnoví automaticky. Úprava mení pamäť; nič sa nezapíše, kým neuložíte alebo nezapnete autoSave.
import { persistedRestate } from '@kkwaenggwari/restate';
export const useDraft = persistedRestate('', {
key: 'article-draft',
validate: (value) => typeof value === 'string',
});Počkajte raz pri spustení
Vo vstupnom bode klienta naimportujte aplikáciu a jej store a pred renderom počkajte na restateManager.ready. Odvtedy môžu komponenty uložené hodnoty čítať priamo.
Nedostupné úložisko, napríklad pri renderovaní na serveri alebo v prehliadači, ktorý ho blokuje, nie je chyba: také store fungujú v pamäti. ready sa odmietne, len keď záznamy nejde prečítať, migrovať alebo validovať.
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();Uložiť, vrátiť a obnoviť predvolené
save zapíše aktuálnu hodnotu, restore sa vráti k uloženej hodnote a resetAll vymaže pamäť aj úložisko. Každá vracia Promise.
await useDraft.save(); // write the current value
await useDraft.restore(); // return to the saved value
await useDraft.resetAndClearStorage(); // initial value in memory, record removedZobrazenie neuložených úprav a priebehu
useStatus sa prekreslí, keď sa zmení stav ukladania. dirty je true, kým sa pamäť líši od naposledy načítanej, uloženej alebo obnovenej hodnoty. operation pomenúva prebiehajúcu operáciu s úložiskom.
Odovzdajte selector, aby sa prekresľovalo len pri zmene jedného poľa.
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>}
</>
);
}Vyskúšajte
Píšte, zvýšte latenciu úložiska a uložte. Prehrajte príklad znova a uvidíte obnovený koncept.
Príprava príkladu…
Automatické ukladanie
Pre nastavenia a koncepty, ktoré sa majú ukladať vždy, ho raz zapnite. autoSave: true ukladá po každej zmene; { delayMs } počká, kým úpravy ustanú.
Séria úprav sa zmení na jeden zápis a návrat k uloženej hodnote nezapíše nič. Chyby sa objavia v status().error. Scope komponentu pri odpojení zapíše čakajúcu úpravu.
export const useTheme = persistedRestate('light', { key: 'theme', autoSave: true });
export const useDraft = persistedRestate('', {
key: 'article-draft',
autoSave: { delayMs: 500 },
});Pred zatvorením stránky
Čítajte rovnaký stav mimo React. Upozornite pred odchodom, ak existujú neuložené úpravy, alebo všetko uložte, keď sa stránka skryje.
window.addEventListener('beforeunload', (event) => {
if (useDraft.status().dirty) event.preventDefault();
});
window.addEventListener('pagehide', () => {
restateManager.saveAll();
});Ošetrenie chýb úložiska
Chyby úložiska odmietnu Promise operácie. Každá chyba restate má code a pri ukladaných store aj key záznamu.
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'}".`);
}