restate / v1.0.0

Запазвайте, когато решите

Пазете store в IndexedDB или MMKV, зареждайте го веднъж при стартиране, запазвайте изрично или автоматично и показвайте незапазените промени.

На тази страницаДеклариране на запазван storeИзчакайте веднъж при стартиранеЗапазване, отмяна и нулиранеПоказване на незапазени промени и напредъкОпитайтеАвтоматично запазванеПреди затваряне на страницатаОбработка на грешки на хранилището

Деклариране на запазван store

Заменете restate с persistedRestate и му дайте key. Компонентите продължават да използват същия hook и същото set.

Запазената стойност се възстановява автоматично след създаването. Редакцията променя паметта; нищо не се записва, докато не запазите или не включите autoSave.

JavaScript / JSX
import { persistedRestate } from '@kkwaenggwari/restate';

export const useDraft = persistedRestate('', {
  key: 'article-draft',
  validate: (value) => typeof value === 'string',
});

Изчакайте веднъж при стартиране

Във входната точка на клиента импортирайте приложението и неговите store, после изчакайте restateManager.ready преди рендериране. Оттам нататък компонентите могат директно да четат запазените стойности.

Недостъпно хранилище, например при рендериране на сървъра или в браузър, който го блокира, не е грешка: тези store работят в паметта. ready се отхвърля само когато записите не могат да се прочетат, мигрират или валидират.

JavaScript / JSX
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.

JavaScript / JSX
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, за да пререндерира само при промяна на едно поле.

JavaScript / JSX
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 на компонент записва чакащата промяна при демонтиране.

JavaScript / JSX
export const useTheme = persistedRestate('light', { key: 'theme', autoSave: true });

export const useDraft = persistedRestate('', {
  key: 'article-draft',
  autoSave: { delayMs: 500 },
});

Преди затваряне на страницата

Четете същото състояние извън React. Предупредете преди напускане, ако има незапазени промени, или запазете всичко, когато страницата се скрие.

JavaScript / JSX
window.addEventListener('beforeunload', (event) => {
  if (useDraft.status().dirty) event.preventDefault();
});

window.addEventListener('pagehide', () => {
  restateManager.saveAll();
});

Обработка на грешки на хранилището

Грешките на хранилището отхвърлят Promise на операцията. Всяка грешка на restate има code, а при запазваните store — и key на записа.

JavaScript / JSX
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'}".`);
}

Търсене в документацията

Търсене в заглавията, описанията и текста на всички ръководства.