useObserver
useObserver is the low-level hook that powers observer. It tracks observable
reads inside a render callback and schedules re-renders when tracked observables
change. Most users should use observer instead.
Signature
function useObserver<T>(
render: () => T,
baseComponentName?: string,
): T
Parameters
| Parameter | Type | Description |
|---|---|---|
render |
() => T |
A function that reads observables and returns JSX (or any value) |
baseComponentName |
string |
Optional label reserved for debugging metadata; currently unused by the runtime |
Basic usage
import { useObserver } from "@fobx/react"
import { store } from "./store"
function Counter() {
return useObserver(() => <p>Count: {store.count}</p>)
}
When to use useObserver over observer
useObserver is useful when you want to keep observable reads localized to one
callback, or when you can’t use observer (e.g., in a render-prop pattern):
function Dashboard() {
// Non-reactive setup
const theme = useContext(ThemeContext)
// Only this callback reads observables
return useObserver(() => (
<div style={{ background: theme.bg }}>
<p>{store.status}</p>
</div>
))
}
Tracked changes still re-render the whole host component. useObserver scopes
dependency tracking to the callback; it does not create a partial-component
render boundary.
Differences from observer
| Feature | observer |
useObserver |
|---|---|---|
Applies React.memo |
Yes | No |
| Preserves static properties | Yes | N/A |
Supports forwardRef |
Yes | N/A |
| Granularity | Wrapped component | Callback-scoped dependency tracking |
Internals
useObserver uses:
- A
Trackerfrom@fobx/core/internalsto record dependency reads - React’s
useSyncExternalStoreto schedule re-renders when dependencies change FinalizationRegistrywhen available, with a timer-based fallback, for automatic cleanup if the component is garbage collected before unmount (guards against memory leaks in edge cases)