restate / v1.0.0

Γίνετε συνδρομητής μόνο σε ό,τι χρειάζεστε

Επιλέξτε από ποιο μέρος του store εξαρτάται κάθε component, συγκρίνετε αντικείμενα με shallow, ομαδοποιήστε αλλαγές με batch και συνδέστε εξωτερικά συμβάντα.

Σε αυτή τη σελίδαΔώστε έναν selectorΔοκιμάστε τοΕπιλογή πολλών πεδίων με shallowΠροσαρμοσμένη σύγκρισηΟμαδοποίηση αλλαγών με batchΣυνδρομή εκτός ReactΣύνδεση εξωτερικών συμβάντων

Δώστε έναν selector

Καλέστε το hook με μια συνάρτηση που επιλέγει ό,τι χρειάζεται το component. Μετά από κάθε αλλαγή, το restate εκτελεί τον selector και συγκρίνει το αποτέλεσμα με το προηγούμενο μέσω Object.is. Αν είναι ίσα, το component δεν αποδίδεται.

Η κάρτα αλλάζει. Αποδίδεται το ItemCount;

Όχι. Ο selector του επιστρέφει ακόμη τον ίδιο αριθμό προϊόντων, οπότε η επιλογή είναι ίση και το React δεν καλείται να αποδώσει.

JavaScript / JSX
const useCart = restate({ items: ['Book'], coupon: '', note: '' });

function ItemCount() {
  // Re-renders only when the number of items changes.
  const count = useCart((cart) => cart.items.length);
  return <p>{count} items</p>;
}

Δοκιμάστε το

Αλλάξτε πεδία και παρακολουθήστε τους μετρητές αποδόσεων. Απενεργοποιήστε το shallow για να δείτε έναν selector που επιστρέφει νέο αντικείμενο κάθε φορά.

Προετοιμασία παραδείγματος…

Επιλογή πολλών πεδίων με shallow

Όταν ένας selector κατασκευάζει αντικείμενο, επιστρέφει νέο κάθε φορά, οπότε το Object.is βλέπει πάντα αλλαγή. Δώστε το shallow ως δεύτερο όρισμα: συγκρίνει τα ίδια πεδία του αντικειμένου σε βάθος ενός επιπέδου.

Το shallow συγκρίνει επίσης σε βάθος ενός επιπέδου τα στοιχεία πινάκων, Map και Set.

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

function CartSummary() {
  const { count, coupon } = useCart(
    (cart) => ({ count: cart.items.length, coupon: cart.coupon }),
    shallow,
  );
  return (
    <p>
      {count} items · {coupon || 'no coupon'}
    </p>
  );
}

Προσαρμοσμένη σύγκριση

Οποιαδήποτε συνάρτηση (left, right) => boolean κάνει ως δεύτερο όρισμα. Χρησιμοποιήστε την όταν το shallow δεν αρκεί, για παράδειγμα για σύγκριση λίστας με βάση το id.

JavaScript / JSX
const ids = useCart(
  (cart) => cart.items.map((item) => item.id),
  (left, right) => left.length === right.length && left.every((id, index) => id === right[index]),
);

Ομαδοποίηση αλλαγών με batch

Κάθε set ειδοποιεί αμέσως τους συνδρομητές. Όταν μια ενέργεια αλλάζει πολλά stores, τυλίξτε την σε batch: η μνήμη ενημερώνεται αμέσως και οι συνδρομητές εκτελούνται μία φορά μετά το callback.

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

function checkout() {
  batch(() => {
    useCart.set((cart) => ({ ...cart, items: [] }));
    useOrder.set((order) => ({ ...order, status: 'paid' }));
  });
  // Subscribers run once, after both stores changed.
}

Συνδρομή εκτός React

Το subscribeSelector σας καλεί μόνο όταν αλλάζει η επιλεγμένη τιμή, με την ίδια προαιρετική συνάρτηση σύγκρισης.

JavaScript / JSX
const stop = useCart.subscribeSelector(
  (cart) => cart.items.length,
  (count, previous) => analytics.track('cart-size', { count, previous }),
);

Σύνδεση εξωτερικών συμβάντων

Το δεύτερο όρισμα του restate μπορεί να είναι updater. Εκτελείται όταν το πρώτο component ή ο πρώτος συνδρομητής αρχίζει να ακούει, και ο καθαρισμός του εκτελείται όταν σταματά ο τελευταίος, οπότε συμβάντα του προγράμματος περιήγησης, sockets ή αισθητήρες συνδέονται μόνο όσο χρειάζεται.

Για χειροκίνητο έλεγχο χρησιμοποιήστε start() και stop().

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

// Listens while at least one component or subscriber uses the store.
export const useOnline = restate(true, ({ setState }) => {
  const update = () => setState(navigator.onLine);
  window.addEventListener('online', update);
  window.addEventListener('offline', update);
  update();
  return () => {
    window.removeEventListener('online', update);
    window.removeEventListener('offline', update);
  };
});

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

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