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 sidan
Deklarera en sparad storeVänta en gång vid startSpara, ångra och återställVisa osparade ändringar och förloppProvaSpara automatisktInnan sidan stängsHantera lagringsfelDeklarera 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.
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.
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.
await useDraft.save(); // write the current value
await useDraft.restore(); // return to the saved value
await useDraft.resetAndClearStorage(); // initial value in memory, record removedVisa 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.
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.
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.
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.
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'}".`);
}