restate / v1.0.0
Simpan saat Anda memutuskan
Simpan store di IndexedDB atau MMKV, muat sekali saat mulai, simpan secara eksplisit atau otomatis, dan tampilkan perubahan yang belum tersimpan.
Di halaman ini
Mendeklarasikan store tersimpanTunggu sekali saat mulaiSimpan, batalkan, dan atur ulangMenampilkan perubahan belum tersimpan dan progresCobaSimpan otomatisSebelum halaman ditutupMenangani kesalahan penyimpananMendeklarasikan store tersimpan
Ganti restate dengan persistedRestate dan beri key. Komponen tetap memakai hook dan set yang sama.
Nilai tersimpan dipulihkan otomatis setelah dibuat. Mengedit mengubah memori; tidak ada yang ditulis sampai Anda menyimpan atau mengaktifkan autoSave.
import { persistedRestate } from '@kkwaenggwari/restate';
export const useDraft = persistedRestate('', {
key: 'article-draft',
validate: (value) => typeof value === 'string',
});Tunggu sekali saat mulai
Di titik masuk klien, impor aplikasi dan store-nya, lalu tunggu restateManager.ready sebelum merender. Setelah itu komponen dapat membaca nilai tersimpan secara langsung.
Penyimpanan yang tidak tersedia, misalnya saat server rendering atau di browser yang memblokirnya, bukan kesalahan: store seperti itu berjalan di memori. ready hanya ditolak bila catatan tidak dapat dibaca, dimigrasi, atau divalidasi.
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();Simpan, batalkan, dan atur ulang
save menulis nilai saat ini, restore kembali ke nilai tersimpan, dan resetAll membersihkan memori dan penyimpanan. Masing-masing mengembalikan Promise.
await useDraft.save(); // write the current value
await useDraft.restore(); // return to the saved value
await useDraft.resetAndClearStorage(); // initial value in memory, record removedMenampilkan perubahan belum tersimpan dan progres
useStatus dirender ulang saat status penyimpanan berubah. dirty bernilai true selama memori berbeda dari nilai terakhir yang dimuat, disimpan, atau dipulihkan. operation menyebut operasi penyimpanan saat ini.
Berikan selector agar hanya dirender ulang saat satu field berubah.
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>}
</>
);
}Coba
Ketik, naikkan penundaan penyimpanan, lalu simpan. Putar ulang contoh untuk melihat draf yang dipulihkan.
Menyiapkan contoh…
Simpan otomatis
Aktifkan sekali untuk pengaturan dan draf yang harus selalu tersimpan. autoSave: true menyimpan setelah setiap perubahan; { delayMs } menunggu sampai perubahan berhenti.
Rentetan perubahan menjadi satu penulisan, dan kembali ke nilai tersimpan tidak menulis apa pun. Kesalahan muncul di status().error. Scope komponen menulis perubahan tertunda saat unmount.
export const useTheme = persistedRestate('light', { key: 'theme', autoSave: true });
export const useDraft = persistedRestate('', {
key: 'article-draft',
autoSave: { delayMs: 500 },
});Sebelum halaman ditutup
Baca status yang sama di luar React. Peringatkan perubahan yang belum tersimpan sebelum pergi, atau simpan semuanya saat halaman disembunyikan.
window.addEventListener('beforeunload', (event) => {
if (useDraft.status().dirty) event.preventDefault();
});
window.addEventListener('pagehide', () => {
restateManager.saveAll();
});Menangani kesalahan penyimpanan
Kesalahan penyimpanan menolak Promise operasinya. Setiap kesalahan restate punya code, dan untuk store tersimpan juga key catatannya.
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'}".`);
}