restate / v1.0.0
שומרים כשמחליטים
שמרו מאגר ב־IndexedDB או ב־MMKV, טענו אותו פעם אחת בהפעלה, שמרו במפורש או אוטומטית, והציגו עריכות שלא נשמרו.
בעמוד הזה
הצהרה על מאגר שמורהמתנה אחת בהפעלהשמירה, ביטול ואיפוסהצגת עריכות שלא נשמרו והתקדמותנסו את זהשמירה אוטומטיתלפני סגירת העמודטיפול בשגיאות אחסוןהצהרה על מאגר שמור
החליפו את restate ב־persistedRestate ותנו לו key. הרכיבים ממשיכים להשתמש באותו hook ובאותו set.
הערך השמור משוחזר אוטומטית אחרי היצירה. עריכה משנה את הזיכרון; שום דבר לא נכתב עד שתשמרו או תפעילו את autoSave.
import { persistedRestate } from '@kkwaenggwari/restate';
export const useDraft = persistedRestate('', {
key: 'article-draft',
validate: (value) => typeof value === 'string',
});המתנה אחת בהפעלה
בנקודת הכניסה של הלקוח, ייבאו את האפליקציה ואת המאגרים שלה, ואז המתינו ל־restateManager.ready לפני הרינדור. מכאן הרכיבים יכולים לקרוא ערכים שמורים ישירות.
אחסון לא זמין, כמו בזמן רינדור בשרת או בדפדפן שחוסם אותו, אינו שגיאה: המאגרים האלה עובדים בזיכרון. 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, ולמאגרים שמורים גם ה־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'}".`);
}