restate / v1.0.0
Sla op wanneer jij besluit
Bewaar een store in IndexedDB of MMKV, laad hem één keer bij het opstarten, sla expliciet of automatisch op en toon niet-opgeslagen bewerkingen.
Op deze pagina
Declareer een opgeslagen storeWacht één keer bij het opstartenOpslaan, ongedaan maken en resettenToon niet-opgeslagen bewerkingen en voortgangProbeer hetAutomatisch opslaanVoordat de pagina sluitOpslagfouten afhandelenDeclareer een opgeslagen store
Vervang restate door persistedRestate en geef hem een key. Componenten blijven dezelfde hook en dezelfde set gebruiken.
De opgeslagen waarde wordt na het aanmaken automatisch teruggezet. Bewerken verandert het geheugen; er wordt niets geschreven totdat je opslaat of autoSave inschakelt.
import { persistedRestate } from '@kkwaenggwari/restate';
export const useDraft = persistedRestate('', {
key: 'article-draft',
validate: (value) => typeof value === 'string',
});Wacht één keer bij het opstarten
Importeer in het client-toegangspunt je app en haar stores, en wacht dan op restateManager.ready voordat je rendert. Daarna kunnen componenten opgeslagen waarden direct lezen.
Onbeschikbare opslag, zoals bij server-rendering of in een browser die het blokkeert, is geen fout: die stores werken in het geheugen. ready wordt alleen geweigerd als records niet kunnen worden gelezen, gemigreerd of gevalideerd.
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();Opslaan, ongedaan maken en resetten
save schrijft de huidige waarde, restore gaat terug naar de opgeslagen waarde en resetAll wist zowel het geheugen als de opslag. Elk geeft een Promise terug.
await useDraft.save(); // write the current value
await useDraft.restore(); // return to the saved value
await useDraft.resetAndClearStorage(); // initial value in memory, record removedToon niet-opgeslagen bewerkingen en voortgang
useStatus rendert opnieuw als de opslagstatus verandert. dirty is true zolang het geheugen afwijkt van de laatst geladen, opgeslagen of teruggezette waarde. operation noemt de lopende opslagbewerking.
Geef een selector door om alleen opnieuw te renderen als één veld verandert.
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>}
</>
);
}Probeer het
Typ, verhoog de opslagvertraging en sla op. Speel het voorbeeld opnieuw af om het opgeslagen concept teruggezet te zien.
Voorbeeld voorbereiden…
Automatisch opslaan
Zet het één keer aan voor instellingen en concepten die altijd bewaard moeten blijven. autoSave: true slaat na elke wijziging op; { delayMs } wacht tot de bewerkingen stoppen.
Een reeks bewerkingen wordt één schrijfactie, en terug naar de opgeslagen waarde schrijft niets. Fouten verschijnen in status().error. Een componentscope schrijft de openstaande bewerking weg bij de unmount.
export const useTheme = persistedRestate('light', { key: 'theme', autoSave: true });
export const useDraft = persistedRestate('', {
key: 'article-draft',
autoSave: { delayMs: 500 },
});Voordat de pagina sluit
Lees dezelfde state buiten React. Waarschuw voor het verlaten als er niet-opgeslagen bewerkingen zijn, of sla alles op zodra de pagina verborgen wordt.
window.addEventListener('beforeunload', (event) => {
if (useDraft.status().dirty) event.preventDefault();
});
window.addEventListener('pagehide', () => {
restateManager.saveAll();
});Opslagfouten afhandelen
Opslagfouten weigeren de Promise van de bewerking. Elke restate-fout heeft een code en, bij opgeslagen stores, de key van het record.
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'}".`);
}