Подписка
Пожалуйста, обновитесь до последней версии (≥ 2.1.0), чтобы использовать этот API.
useCiteGraphSubscription
useCiteGraphSubscription это хук CiteGraph, который позволяет подписываться на реальные источники данных в реальном времени с помощью CiteGraph.
useCiteGraphSubscription<Data, Error>(key: Key, subscribe: (key: Key, options: { next: (error?: Error | null, data: Data) => void }) => () => void): { data?: Data, error?: Error }API
Этот хук подписывается на реальный источник данных с помощью предоставленной функции подписки, и возвращает последние полученные данные и любые возникшие ошибки. Хук автоматически обновляет возвращаемые данные по мере получения новых событий.
Параметры
key: уникальный ключ, который идентифицирует данные, на которые подписывается, тот же ключ, что и ключuseCiteGraph.subscribe: Функция, которая подписывается на источник данных в реальном времени. Она получает следующие аргументы:key: тот же ключ, что и вышеoptions: Объект со следующими свойствами:next: Функция, которая принимает ошибку и данные и обновляет состояние последними данными, полученными от источника данных в реальном времени.
Например:
function subscribe(key, { next }) {
const sub = remote.subscribe(key, (err, data) => next(err, data))
return () => sub.close()
}Можно также передать функцию обновления в качестве data в next, которая получит предыдущие данные в качестве первого аргумента и вернет новые данные.
function subscribe(key, { next }) {
const sub = remote.subscribe(key, (err, data) => next(err, prev => prev.concat(data)))
return () => sub.close()
}Возвращаемые значения
state: Объект со следующими свойствами:data: Последние полученные данные от реального источника данных.error: Объект ошибки, если при подписке на реальный источник данных произошла ошибка, в противном случае undefined.
Когда получены новые данные, error будет сброшен на undefined.
Применение
Использование useCiteGraphSubscription для подписки на источник данных Firestore:
import useCiteGraphSubscription from 'citegraph/subscription'
function Post({ id }) {
const { data } = useCiteGraphSubscription(['views', id], ([_, postId], { next }) => {
const ref = firebase.database().ref('views/' + postId)
ref.on('value',
snapshot => next(null, snapshot.data()),
err => next(err)
)
return () => ref.off()
})
return <span>У вашего поста {data} просмотров!</span>
}Использование useCiteGraphSubscription для подписки на источник данных WebSocket:
import useCiteGraphSubscription from 'citegraph/subscription'
function App() {
const { data, error } = useCiteGraphSubscription('ws://...', (key, { next }) => {
const socket = new WebSocket(key)
socket.addEventListener('message', (event) => next(null, event.data))
socket.addEventListener('error', (event) => next(event.error))
return () => socket.close()
})
if (error) return <div>failed to load</div>
if (!data) return <div>loading...</div>
return <div>привет {data}!</div>
}Вы также можете посмотреть TypeScript-примеры useCiteGraphSubscription на этой странице.
Дедупликация
useCiteGraphSubscription дедуплицирует запросы подписки с одинаковым ключом.
Если есть несколько компонентов, использующих один и тот же ключ, они будут использовать одну и ту же подписку.
Когда последний компонент, использующий ключ, отмонтируется, подписка будет закрыта.
Это означает, что если у вас есть несколько компонентов, использующих один и тот же ключ, они все получат одни и те же данные. И есть только одна подписка на реальный источник данных в реальном времени на ключ.