restate / v1.0.0

Yalnızca ihtiyacınız olana abone olun

Her bileşenin store'un hangi kısmına bağlı olduğunu seçin, nesneleri shallow ile karşılaştırın, değişiklikleri batch ile gruplayın ve dış olayları bağlayın.

Bu sayfadaBir selector verinDeneyinshallow ile birkaç alan seçmekÖzel karşılaştırmaDeğişiklikleri batch ile gruplamakReact dışında abonelikDış olayları bağlamak

Bir selector verin

Hook'u bileşenin ihtiyaç duyduğunu seçen bir fonksiyonla çağırın. Her değişiklikten sonra restate selector'ı çalıştırır ve sonucu öncekiyle Object.is ile karşılaştırır. İkisi eşitse bileşen render edilmez.

Kart değişiyor. ItemCount render edilir mi?

Hayır. Onun selector'ı hâlâ aynı ürün sayısını döndürür; seçim eşit olduğu için React'ten render istenmez.

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>;
}

Deneyin

Alanları değiştirin ve render sayaçlarını izleyin. Her seferinde yeni nesne döndüren bir selector'ı görmek için shallow'u kapatın.

Örnek hazırlanıyor…

shallow ile birkaç alan seçmek

Bir selector nesne oluşturduğunda her seferinde yenisini döndürür, bu yüzden Object.is her zaman değişiklik görür. İkinci argüman olarak shallow verin: nesnenin kendi alanlarını bir düzey derinlikte karşılaştırır.

shallow dizilerin, Map ve Set'lerin öğelerini de bir düzey derinlikte karşılaştırır.

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>
  );
}

Özel karşılaştırma

İkinci argüman olarak herhangi bir (left, right) => boolean fonksiyonu kullanılabilir. shallow yetmediğinde, örneğin bir listeyi id ile karşılaştırmak için kullanın.

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]),
);

Değişiklikleri batch ile gruplamak

Her set aboneleri hemen bilgilendirir. Bir eylem birkaç store'u değiştirdiğinde onu batch ile sarın: bellek hemen güncellenir, aboneler callback'ten sonra bir kez çalışır.

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 dışında abonelik

subscribeSelector sizi yalnızca seçilen değer değiştiğinde, aynı isteğe bağlı karşılaştırma fonksiyonuyla çağırır.

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

Dış olayları bağlamak

restate'in ikinci argümanı bir updater olabilir. İlk bileşen ya da abone dinlemeye başladığında çalışır, temizliği ise sonuncusu durduğunda çalışır; böylece tarayıcı olayları, soketler ya da sensörler yalnızca gerektiği sürece bağlı kalır.

Elle denetim için start() ve stop() kullanın.

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);
  };
});

Belgelerde ara

Tüm kılavuzların başlık, açıklama ve içeriğinde arayın.