# Reactive Polling

> Poll for changes to any value and trigger React re-renders when it changes. Use when this capability is needed.

- Skill: `tomevault-io/reactive-polling` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/reactive-polling`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/reactive-polling/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/reactive-polling

---


# Reactive Polling

Poll for changes to any value and trigger React re-renders when it changes.

## Technique

Create a `useReactive` hook that uses `useFrame` to periodically check a selector function. When the value changes, update React state to trigger a re-render. Throttle with a configurable FPS.

## Key Concepts

- Selector function returns the value to watch
- Compare with previous value to detect changes
- Only update state when value actually changes
- Throttle polling with `useFrame`'s `fps` option
- Use sparingly for values that don't change frequently

## Usage

```tsx
const useReactive = <T,>(selector: () => T, fps = 30): T => {
  const [reactiveValue, setReactiveValue] = useState<T>(selector())
  const previousValueRef = useRef(reactiveValue)

  useFrame(
    () => {
      const newValue = selector()
      if (previousValueRef.current !== newValue) {
        previousValueRef.current = newValue
        setReactiveValue(newValue)
      }
    },
    { fps }
  )

  return reactiveValue
}

// Usage
const isAboveZero = useReactive(() => position.y > 0)
```

---

This skill is part of [verekia](https://x.com/verekia)'s [**r3f-gamedev**](https://github.com/verekia/r3f-gamedev).

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/verekia) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-11 -->

