restate / v1.0.0
जब तय करें तब सहेजें
स्टोर को IndexedDB या MMKV में रखें, स्टार्टअप पर एक बार लोड करें, स्पष्ट रूप से या अपने-आप सहेजें और बिना सहेजे बदलाव दिखाएँ।
इस पेज पर
सहेजे गए स्टोर की घोषणास्टार्टअप पर एक बार इंतज़ार करेंसहेजना, पूर्ववत करना और रीसेटबिना सहेजे बदलाव और प्रगति दिखानाआज़माएँअपने-आप सहेजनापेज बंद होने से पहलेस्टोरेज त्रुटियाँ संभालनासहेजे गए स्टोर की घोषणा
restate को persistedRestate से बदलें और उसे key दें। कंपोनेंट वही हुक और वही 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'}".`);
}