コンテンツへスキップ
ドキュメント
サブスクリプション

サブスクリプション

この API を使用するには、最新バージョン(≥ 2.1.0)にアップデートしてください。

useSWRSubscription

useSWRSubscription は、SWR を使用してリアルタイムデータソースを購読できる React フックです。

useSWRSubscription<Data, Error>(key: Key, subscribe: (key: Key, options: { next: (error?: Error | null, data: Data) => void }) => () => void): { data?: Data, error?: Error }

API

このフックは、提供された subscribe 関数を使用してリアルタイムデータソースを購読し、受信した最新のデータと発生したエラーを返します。このフックは、新しいイベントを受信するたびに、返されたデータを自動的に更新します。

パラメーター

  • key: サブスクライブするデータを識別する一意のキー。useSWR キーと同じキーです。
  • subscribe: リアルタイムデータソースを購読する関数。次の引数を受け取ります。
    • key: 上記と同じキー
    • options: 次のプロパティを持つオブジェクト
      • next: エラーとデータを受け取り、リアルタイムデータソースから受信した最新のデータで状態を更新する関数。

たとえば

function subscribe(key, { next }) {
  const sub = remote.subscribe(key, (err, data) => next(err, data))
  return () => sub.close()
}

nextdata としてアップデーター関数を渡すこともできます。この関数は、最初の引数として以前のデータを受け取り、新しいデータを返します。

function subscribe(key, { next }) {
  const sub = remote.subscribe(key, (err, data) => next(err, prev => prev.concat(data)))
  return () => sub.close()
}

戻り値

  • state: 次のプロパティを持つオブジェクト
    • data: リアルタイムデータソースから受信した最新のデータ。
    • error: リアルタイムデータソースへのサブスクライブ中にエラーが発生した場合の Error オブジェクト。それ以外の場合は undefined。

新しいデータを受信すると、errorundefined にリセットされます。

使い方

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>Your post has {data} views!</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>hello {data}!</div>
}

useSWRSubscription の TypeScript の例については、このページ で確認できます。

重複排除

useSWRSubscription は、同じキーを持つサブスクリプションリクエストを重複排除します。同じキーを使用する複数のコンポーネントがある場合、それらは同じサブスクリプションを共有します。キーを使用する最後のコンポーネントがアンマウントされると、サブスクリプションは閉じられます。

これは、同じキーを使用する複数のコンポーネントがある場合、それらはすべて同じデータを受信することを意味します。また、キーごとにリアルタイムデータソースへのサブスクリプションは 1 つだけです。