restate / v1.0.0

Karar verdiğinizde kaydedin

Bir store'u IndexedDB ya da MMKV'de tutun, başlangıçta bir kez yükleyin, açıkça ya da otomatik olarak kaydedin ve kaydedilmemiş değişiklikleri gösterin.

Bu sayfadaKayıtlı store bildirmekBaşlangıçta bir kez bekleyinKaydetme, geri alma ve sıfırlamaKaydedilmemiş değişiklikleri ve ilerlemeyi göstermekDeneyinOtomatik kaydetmeSayfa kapanmadan önceDepolama hatalarını ele almak

Kayıtlı store bildirmek

restate'i persistedRestate ile değiştirin ve ona bir key verin. Bileşenler aynı hook'u ve aynı set'i kullanmayı sürdürür.

Kayıtlı değer oluşturulduktan sonra otomatik olarak geri yüklenir. Düzenleme belleği değiştirir; siz kaydedene ya da autoSave'i açana kadar hiçbir şey yazılmaz.

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

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

Başlangıçta bir kez bekleyin

İstemci giriş noktasında uygulamayı ve store'larını import edin, sonra render etmeden önce restateManager.ready'yi bekleyin. Bundan sonra bileşenler kayıtlı değerleri doğrudan okuyabilir.

Kullanılamayan depolama, örneğin sunucu tarafı render'da ya da onu engelleyen bir tarayıcıda, hata değildir: bu tür store'lar bellekte çalışır. ready yalnızca kayıtlar okunamadığında, taşınamadığında ya da doğrulanamadığında reddedilir.

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();

Kaydetme, geri alma ve sıfırlama

save geçerli değeri yazar, restore kayıtlı değere döner, resetAll hem belleği hem depolamayı temizler. Her biri bir Promise döndürür.

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

Kaydedilmemiş değişiklikleri ve ilerlemeyi göstermek

useStatus kaydetme durumu değiştiğinde yeniden render edilir. Bellek en son yüklenen, kaydedilen ya da geri yüklenen değerden farklı olduğu sürece dirty true'dur. operation geçerli depolama işleminin adını verir.

Yalnızca tek bir alan değiştiğinde yeniden render etmek için bir selector verin.

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>}
    </>
  );
}

Deneyin

Yazın, depolama gecikmesini artırın ve kaydedin. Geri yüklenen taslağı görmek için örneği yeniden oynatın.

Örnek hazırlanıyor…

Otomatik kaydetme

Her zaman kaydedilmesi gereken ayarlar ve taslaklar için bir kez açın. autoSave: true her değişiklikten sonra kaydeder; { delayMs } değişiklikler durana kadar bekler.

Bir dizi değişiklik tek bir yazmaya dönüşür ve kayıtlı değere dönmek hiçbir şey yazmaz. Hatalar status().error içinde görünür. Bileşen scope'u ayrılırken bekleyen değişikliği yazar.

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

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

Sayfa kapanmadan önce

Aynı durumu React dışında okuyun. Ayrılmadan önce kaydedilmemiş değişiklikler için uyarın ya da sayfa gizlendiğinde her şeyi kaydedin.

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

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

Depolama hatalarını ele almak

Depolama hataları işlemin Promise'ini reddeder. Her restate hatasının bir code'u, kayıtlı store'larda ise kaydın key'i de vardır.

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

Belgelerde ara

Tüm kılavuzların başlık, açıklama ve içeriğinde arayın.