restate / v1.0.0

Tilaa vain se, mitä tarvitset

Valitse, mistä storen osasta kukin komponentti riippuu, vertaa objekteja shallow-funktiolla, ryhmittele muutokset batchilla ja kytke ulkoiset tapahtumat.

Tällä sivullaAnna selectorKokeileUsean kentän valitseminen shallow-funktiollaOma vertailuMuutosten ryhmittely batchillaTilaaminen Reactin ulkopuolellaUlkoisten tapahtumien kytkeminen

Anna selector

Kutsu hookia funktiolla, joka valitsee sen, mitä komponentti tarvitsee. Jokaisen muutoksen jälkeen restate ajaa selectorin ja vertaa tulosta edelliseen Object.is-vertailulla. Jos ne ovat samat, komponentti ei renderöidy.

Kortti muuttuu. Renderöityykö ItemCount?

Ei. Sen selector palauttaa yhä saman tuotemäärän, joten valinta on sama eikä Reactia pyydetä renderöimään.

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

Kokeile

Muuta kenttiä ja seuraa renderöintilaskureita. Poista shallow käytöstä nähdäksesi selectorin, joka palauttaa joka kerta uuden objektin.

Valmistellaan esimerkkiä…

Usean kentän valitseminen shallow-funktiolla

Kun selector rakentaa objektin, se palauttaa joka kerta uuden, joten Object.is näkee aina muutoksen. Anna shallow toisena argumenttina: se vertaa objektin omia kenttiä yhden tason syvyydeltä.

shallow vertaa yhden tason syvyydeltä myös taulukoiden, Map- ja Set-rakenteiden alkioita.

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

Oma vertailu

Toisena argumenttina kelpaa mikä tahansa (left, right) => boolean -funktio. Käytä sitä, kun shallow ei riitä, esimerkiksi listan vertaamiseen id:n perusteella.

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

Muutosten ryhmittely batchilla

Jokainen set ilmoittaa tilaajille heti. Kun yksi toiminto muuttaa useita storeja, kääri se batchiin: muisti päivittyy heti, ja tilaajat suoritetaan kerran callbackin jälkeen.

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

Tilaaminen Reactin ulkopuolella

subscribeSelector kutsuu sinua vain, kun valittu arvo muuttuu, samalla valinnaisella vertailufunktiolla.

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

Ulkoisten tapahtumien kytkeminen

restaten toinen argumentti voi olla updater. Se käynnistyy, kun ensimmäinen komponentti tai tilaaja alkaa kuunnella, ja sen siivous suoritetaan, kun viimeinen lopettaa, joten selaintapahtumat, socketit tai anturit ovat kytkettyinä vain tarvittaessa.

Käytä käsiohjaukseen start()- ja stop()-funktioita.

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

Hae dokumentaatiosta

Hae kaikkien oppaiden otsikoista, kuvauksista ja sisällöstä.