Подписка
Пожалуйста, обновитесь до последней версии (≥ 2.1.0), чтобы использовать этот API.
useSWRSubscription
useSWRSubscription
это хук React, который позволяет подписываться на реальные источники данных в реальном времени с помощью SWR.
useSWRSubscription<Data, Error>(key: Key, subscribe: (key: Key, options: { next: (error?: Error | null, data: Data) => void }) => () => void): { data?: Data, error?: Error }
API
Этот хук подписывается на реальный источник данных с помощью предоставленной функции подписки, и возвращает последние полученные данные и любые возникшие ошибки. Хук автоматически обновляет возвращаемые данные по мере получения новых событий.
Параметры
key
: уникальный ключ, который идентифицирует данные, на которые подписывается, тот же ключ, что и ключuseSWR
.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
.
Применение
Использование useSWRSubscription
для подписки на источник данных Firestore:
import useSWRSubscription from 'swr/subscription'
function Post({ id }) {
const { data } = useSWRSubscription(['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>
}
Использование useSWRSubscription
для подписки на источник данных WebSocket:
import useSWRSubscription from 'swr/subscription'
function App() {
const { data, error } = useSWRSubscription('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-примеры useSWRSubscription
на этой странице.
Дедупликация
useSWRSubscription
дедуплицирует запросы подписки с одинаковым ключом.
Если есть несколько компонентов, использующих один и тот же ключ, они будут использовать одну и ту же подписку.
Когда последний компонент, использующий ключ, отмонтируется, подписка будет закрыта.
Это означает, что если у вас есть несколько компонентов, использующих один и тот же ключ, они все получат одни и те же данные. И есть только одна подписка на реальный источник данных в реальном времени на ключ.