アバターの画像

@kou_hey3

最終更新日:

ツイート

ReactでPollingするcustom hooksを作った

React のポーリング用 hooks を作ったので、その詳細を記録しておきます。

はじめに

React でポーリングを行うための hooks 、 react-use-polling を作りました。

Web アプリケーションで定期的にデータを取得したい場面、たまにあると思います。
最近では SWR などのライブラリを使うことで簡単に対応することは可能です。
しかし、SWR を使っていないある程度成熟したアプリケーションの場合、 SWR を導入するほどではないけどポーリング対応したい時があります。(SWR に移行していく選択も状況によっては有ります)

一般的には setInterval などを使って定期実行させると思いますが、状況によっては「バックグラウンドでは止めておいて、アクティブに戻ったら再開したい」場合や「特定の状態では一時停止したい」場合なども想定すると、やや面倒くさいです。
そこである程度汎用化したものを custom hooks として作っておいたら便利ではと思い作ったものが react-use-polling です。

使い方

使い方はシンプルです。
定期実行させたい非同期関数と間隔を hooks に渡すだけでポーリングを行うことが出来ます。

react-use-polling には、バックグラウンドではポーリングを止めておく usePolling と、ブラウザがアクティブかどうかに問わず動き続ける usePollingForce を実装しています。

それぞれの hooks は、ポーリングの動作状態、一時停止、再開を行う Controls を返します。
使用するコンポーネント側で、これらの情報を使った制御を行うことが可能です。

また、 onError を渡すことで、ポーリング中にエラーが発生した場合のハンドリングの制御も可能としています。

それぞれの hooks に関して簡単な例を記載しておきます。

このライブラリは npm から追加することができます。

npm install react-use-polling

usePolling

import { usePolling } from 'react-use-polling'

const INTERVAL = 1000

const asyncFunction = async () => {
  // ...
}

function App() {
  usePolling(asyncFunction, INTERVAL)

  return (
    // ...
  )
}

これだけで asyncFunction が定期実行されるようになります。
このコンポーネントがアンマウントされるとポーリングは完全に停止します。
バックグラウンドで停止する仕組みには requestAnimationFrame を利用しています。

usePollingForce

import { usePollingForce } from 'react-use-polling'

const INTERVAL = 1000

const asyncFunction = async () => {
  // ...
}

function App() {
  usePollingForce(asyncFunction, INTERVAL)

  return (
    // ...
  )
}

使い方は usePolling と一緒です。
こちらもアンマウント時には完全に停止します。
違いとしては、ブラウザがバックグラウンドにあっても動作します。

まとめ

React でポーリングを行うための react-use-polling を作りました。
リリース時は最低限の機能しか実装していませんが、随時機能追加を行っていこうかと思っています。

記事一覧に戻る