use-context-selector
React Context and useContext is often used to avoid prop drilling, however it's known that there's a performance issue. When a context value is changed, all components that useContext will re-render.
useContextSelector is recently proposed. While waiting for the process, this library provides the API in userland.
Install
Usage
Technical memo
React context by nature triggers propagation of component re-rendering
if a value is changed. To avoid this, this library uses undocumented
feature of calculateChangedBits
. It then uses a subscription model
to force update when a component needs to re-render.
API
createContext
This creates a special context for useContextSelector
.
Parameters
defaultValue
any
Examples
Returns React.Context
useContextSelector
This hook returns context selected value by selector.
It will only accept context created by createContext
.
It will trigger re-render if only the selected value is referencially changed.
Parameters
context
React.Contextselector
Function
Examples
Returns any
useContext
This hook returns the entire context value.
Use this instead of React.useContext for consistent behavior.
Parameters
context
React.Context
Examples
Returns any
Limitations
- Subscriptions are per-context basis. So, even if there are multiple context providers in a component tree, all components are subscribed to all providers. This may lead false positives (extra re-renders).
- In order to stop propagation,
children
of a context provider has to be either created outside of the provider or memoized withReact.memo
. - Context consumers are not supported.
- The stale props issue can't be solved in userland. (workaround with try-catch)
Examples
The examples folder contains working examples.
You can run one of them with
and open http://localhost:8080 in your web browser.