restate / v1.0.0
Gem, når du beslutter det
Gem en store i IndexedDB eller MMKV, indlæs den én gang ved opstart, gem eksplicit eller automatisk, og vis ikke-gemte ændringer.
På denne side
Erklær en gemt storeVent én gang ved opstartGem, fortryd og nulstilVis ikke-gemte ændringer og fremskridtPrøv detGem automatiskFør siden lukkesHåndtér lagerfejlErklær en gemt store
Skift restate ud med persistedRestate, og giv den en key. Komponenterne bruger stadig samme hook og samme set.
Den gemte værdi gendannes automatisk efter oprettelsen. At redigere ændrer hukommelsen; intet skrives, før du gemmer eller slår autoSave til.
import { persistedRestate } from '@kkwaenggwari/restate';
export const useDraft = persistedRestate('', {
key: 'article-draft',
validate: (value) => typeof value === 'string',
});Vent én gang ved opstart
Importér appen og dens stores i klientens indgangspunkt, og vent derefter på restateManager.ready, før du renderer. Derefter kan komponenterne læse gemte værdier direkte.
Utilgængeligt lager, som ved serverrendering eller i en browser, der blokerer det, er ikke en fejl: de stores kører i hukommelsen. ready afvises kun, når poster ikke kan læses, migreres eller valideres.
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();Gem, fortryd og nulstil
save skriver den aktuelle værdi, restore går tilbage til den gemte værdi, og resetAll rydder både hukommelse og lager. Hver returnerer et Promise.
await useDraft.save(); // write the current value
await useDraft.restore(); // return to the saved value
await useDraft.resetAndClearStorage(); // initial value in memory, record removedVis ikke-gemte ændringer og fremskridt
useStatus renderes igen, når gemmestatus ændrer sig. dirty er true, så længe hukommelsen afviger fra den senest indlæste, gemte eller gendannede værdi. operation angiver den igangværende lagerhandling.
Giv en selector for kun at rendere igen, når ét felt ændrer sig.
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>}
</>
);
}Prøv det
Skriv, hæv lagerforsinkelsen, og gem. Afspil eksemplet igen for at se den gemte kladde gendannet.
Forbereder eksemplet…
Gem automatisk
Slå det til én gang for indstillinger og kladder, der altid skal gemmes. autoSave: true gemmer efter hver ændring; { delayMs } venter, til ændringerne stopper.
En række ændringer bliver til én skrivning, og at gå tilbage til den gemte værdi skriver ingenting. Fejl vises i status().error. Et komponent-scope skriver den ventende ændring ved unmount.
export const useTheme = persistedRestate('light', { key: 'theme', autoSave: true });
export const useDraft = persistedRestate('', {
key: 'article-draft',
autoSave: { delayMs: 500 },
});Før siden lukkes
Læs den samme state uden for React. Advar, før brugeren forlader siden, hvis der er ikke-gemte ændringer, eller gem alt, når siden skjules.
window.addEventListener('beforeunload', (event) => {
if (useDraft.status().dirty) event.preventDefault();
});
window.addEventListener('pagehide', () => {
restateManager.saveAll();
});Håndtér lagerfejl
Lagerfejl afviser handlingens Promise. Hver restate-fejl har en code og, for gemte stores, postens key.
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'}".`);
}