restate / v1.0.0
Naročite se le na tisto, kar potrebujete
Izberite, od katerega dela storea je odvisna vsaka komponenta, primerjajte objekte s shallow, združujte spremembe z batch in povežite zunanje dogodke.
Na tej strani
Podajte selectorPreizkusiteIzbor več polj s shallowLastna primerjavaZdruževanje sprememb z batchNaročnina zunaj ReactaPovezovanje zunanjih dogodkovPodajte selector
Pokličite hook s funkcijo, ki izbere, kar komponenta potrebuje. Po vsaki spremembi restate zažene selector in rezultat primerja s prejšnjim z Object.is. Če sta enaka, se komponenta ne upodobi.
Kartica se spremeni. Se ItemCount upodobi?
Ne. Njegov selector še vedno vrne enako število izdelkov, zato je izbor enak in React ni pozvan k upodobitvi.
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>;
}Preizkusite
Spreminjajte polja in spremljajte števce upodobitev. Izklopite shallow, da vidite selector, ki vsakič vrne nov objekt.
Pripravljanje primera …
Izbor več polj s shallow
Ko selector sestavi objekt, vsakič vrne novega, zato Object.is vedno vidi spremembo. Podajte shallow kot drugi argument: primerja lastna polja objekta eno raven globoko.
shallow eno raven globoko primerja tudi elemente polj, Map in Set.
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>
);
}Lastna primerjava
Kot drugi argument je primerna katera koli funkcija (left, right) => boolean. Uporabite jo, ko shallow ne zadošča, na primer za primerjavo seznama po id.
const ids = useCart(
(cart) => cart.items.map((item) => item.id),
(left, right) => left.length === right.length && left.every((id, index) => id === right[index]),
);Združevanje sprememb z batch
Vsak set takoj obvesti naročnike. Ko eno dejanje spremeni več storejev, ga ovijte v batch: pomnilnik se takoj posodobi, naročniki pa se izvedejo enkrat po callbacku.
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.
}Naročnina zunaj Reacta
subscribeSelector vas pokliče le, ko se izbrana vrednost spremeni, z isto neobvezno funkcijo primerjave.
const stop = useCart.subscribeSelector(
(cart) => cart.items.length,
(count, previous) => analytics.track('cart-size', { count, previous }),
);Povezovanje zunanjih dogodkov
Drugi argument restate je lahko updater. Zažene se, ko prva komponenta ali naročnik začne poslušati, njegovo čiščenje pa se izvede, ko preneha zadnji, zato so dogodki brskalnika, vtičnice ali senzorji povezani le, dokler so potrebni.
Za ročno upravljanje uporabite start() in stop().
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);
};
});