restate / v1.0.0
Запазвайте, когато решите
Пазете store в IndexedDB или MMKV, зареждайте го веднъж при стартиране, запазвайте изрично или автоматично и показвайте незапазените промени.
На тази страница
Деклариране на запазван storeИзчакайте веднъж при стартиранеЗапазване, отмяна и нулиранеПоказване на незапазени промени и напредъкОпитайтеАвтоматично запазванеПреди затваряне на страницатаОбработка на грешки на хранилищетоДеклариране на запазван store
Заменете restate с persistedRestate и му дайте key. Компонентите продължават да използват същия hook и същото set.
Запазената стойност се възстановява автоматично след създаването. Редакцията променя паметта; нищо не се записва, докато не запазите или не включите autoSave.
import { persistedRestate } from '@kkwaenggwari/restate';
export const useDraft = persistedRestate('', {
key: 'article-draft',
validate: (value) => typeof value === 'string',
});Изчакайте веднъж при стартиране
Във входната точка на клиента импортирайте приложението и неговите store, после изчакайте restateManager.ready преди рендериране. Оттам нататък компонентите могат директно да четат запазените стойности.
Недостъпно хранилище, например при рендериране на сървъра или в браузър, който го блокира, не е грешка: тези store работят в паметта. ready се отхвърля само когато записите не могат да се прочетат, мигрират или валидират.
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();Запазване, отмяна и нулиране
save записва текущата стойност, restore връща запазената стойност, а resetAll изчиства и паметта, и хранилището. Всеки връща Promise.
await useDraft.save(); // write the current value
await useDraft.restore(); // return to the saved value
await useDraft.resetAndClearStorage(); // initial value in memory, record removedПоказване на незапазени промени и напредък
useStatus се пререндерира, когато статусът на запазване се промени. dirty е true, докато паметта се различава от последно заредената, запазената или възстановената стойност. operation назовава текущата операция с хранилището.
Подайте selector, за да пререндерира само при промяна на едно поле.
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>}
</>
);
}Опитайте
Пишете, увеличете забавянето на хранилището и запазете. Пуснете примера отново, за да видите възстановената чернова.
Подготовка на примера…
Автоматично запазване
За настройки и чернови, които винаги трябва да се запазват, го включете веднъж. autoSave: true запазва след всяка промяна; { delayMs } изчаква промените да спрат.
Поредица промени става един запис, а връщането към запазената стойност не записва нищо. Грешките се появяват в status().error. Scope на компонент записва чакащата промяна при демонтиране.
export const useTheme = persistedRestate('light', { key: 'theme', autoSave: true });
export const useDraft = persistedRestate('', {
key: 'article-draft',
autoSave: { delayMs: 500 },
});Преди затваряне на страницата
Четете същото състояние извън React. Предупредете преди напускане, ако има незапазени промени, или запазете всичко, когато страницата се скрие.
window.addEventListener('beforeunload', (event) => {
if (useDraft.status().dirty) event.preventDefault();
});
window.addEventListener('pagehide', () => {
restateManager.saveAll();
});Обработка на грешки на хранилището
Грешките на хранилището отхвърлят Promise на операцията. Всяка грешка на restate има code, а при запазваните store — и 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'}".`);
}