useSubscription()
Ótimo para manter recursos atualizados quando eles mudam com frequência.
Ao usar as assinaturas de polling padrão, a frequência deve ser definida no Endpoint; caso contrário, não terá nenhum efeito.
useLive() é uma forma mais concisa de usar em combinação com useSuspense(),
Uso
import { RestEndpoint, Entity } from '@data-client/rest';
export class Price extends Entity {
symbol = '';
price = '0.0';
// ...
pk() {
return this.symbol;
}
}
export const getPrice = new RestEndpoint({
urlPrefix: 'http://test.com',
path: '/price/:symbol',
schema: Price,
pollFrequency: 5000,
});
import { useSuspense, useSubscription } from '@data-client/react';
import { getPrice } from 'api/Price';
function MasterPrice({ symbol }: { symbol: string }) {
const price = useSuspense(getPrice, { symbol });
useSubscription(getPrice, { symbol });
// ...
}
Comportamento
Usar null como segundo argumento de qualquer hook do Data Client significa "não fazer nada."
// todo could be undefined if id is undefined
const todo = useSubscription(TodoResource.get, id ? { id } : null);
Ao usar o React Navigation, useSubscription() assina e cancela a assinatura quando a tela ganha e perde o foco, respectivamente.
Tipos
- Type
- With Generics
function useSubscription(
endpoint: ReadEndpoint,
...args: Parameters<typeof endpoint> | [null]
): void;
function useSubscription<
E extends EndpointInterface<
FetchFunction,
Schema | undefined,
undefined
>,
Args extends readonly [...Parameters<E>] | readonly [null],
>(endpoint: E, ...args: Args): void;
Exemplos
Assinar apenas enquanto o elemento está visível
import { useIntersectionObserver } from '@uidotdev/usehooks';
import { useSuspense, useSubscription } from '@data-client/react';
import { getPrice } from 'api/Price';
function MasterPrice({ symbol }: { symbol: string }) {
const price = useSuspense(getPrice, { symbol });
const [ref, entry] = useIntersectionObserver();
// null params means don't subscribe
useSubscription(getPrice, entry?.isIntersecting ? { symbol } : null);
return <div ref={ref}>{price.price}</div>;
}
Quando null é enviado como segundo argumento, a assinatura é desativada. Claro que,
se outros componentes ainda estiverem inscritos, as atualizações dos dados continuarão ativas.
useIntersectionObserver() usa o IntersectionObserver, que tem ótimo desempenho. O ref nos permite acessar o DOM.
Preços de criptomoedas (websockets)
Implementamos nosso próprio StreamManager para tratar nosso protocolo de websocket personalizado. Aqui escutamos as actions de subscribe/unsubscribe
enviadas pelo useSubscription para garantir que só escutemos atualizações dos componentes que estão renderizados.
Explore o exemplo coin-app