restate / v1.0.0

Αποθηκεύστε όταν αποφασίσετε

Κρατήστε ένα store στο IndexedDB ή στο MMKV, φορτώστε το μία φορά στην εκκίνηση, αποθηκεύστε ρητά ή αυτόματα και δείξτε τις μη αποθηκευμένες αλλαγές.

Σε αυτή τη σελίδαΔήλωση αποθηκευμένου storeΠεριμένετε μία φορά στην εκκίνησηΑποθήκευση, αναίρεση και επαναφοράΕμφάνιση μη αποθηκευμένων αλλαγών και προόδουΔοκιμάστε τοΑυτόματη αποθήκευσηΠριν κλείσει η σελίδαΧειρισμός σφαλμάτων αποθήκευσης

Δήλωση αποθηκευμένου store

Αντικαταστήστε το restate με το persistedRestate και δώστε του ένα key. Τα components συνεχίζουν να χρησιμοποιούν το ίδιο hook και το ίδιο set.

Η αποθηκευμένη τιμή ανακτάται αυτόματα μετά τη δημιουργία. Η επεξεργασία αλλάζει τη μνήμη· τίποτα δεν γράφεται μέχρι να αποθηκεύσετε ή να ενεργοποιήσετε το autoSave.

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

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

Περιμένετε μία φορά στην εκκίνηση

Στο σημείο εισόδου του client, εισαγάγετε την εφαρμογή και τα stores της και περιμένετε το restateManager.ready πριν από την απόδοση. Από εκεί και πέρα τα components μπορούν να διαβάζουν απευθείας τις αποθηκευμένες τιμές.

Η μη διαθέσιμη αποθήκευση, όπως στην απόδοση στον διακομιστή ή σε πρόγραμμα περιήγησης που την μπλοκάρει, δεν είναι σφάλμα: τέτοια stores τρέχουν στη μνήμη. Το 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 ενός component γράφει την εκκρεμή αλλαγή κατά την αποπροσάρτηση.

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, και στα αποθηκευμένα stores και το 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'}".`);
}

Αναζήτηση στην τεκμηρίωση

Αναζήτηση σε τίτλους, περιγραφές και περιεχόμενο όλων των οδηγών.