Force Re-rendering a React Component Without setState
By hunglv, at: Sept. 22, 2025, 9:07 a.m.
Estimated Reading Time: __READING_TIME__ minutes


Problem:
In React, sometimes, you need to force a component to re-render even when there’s no meaningful change in its state. For example, you might be listening to an external event (e.g., WebSocket, event emitter, or custom store) that doesn’t affect the component’s local state but still needs a visual update.
Common Scenario:
useEffect(() => {
someObservable.on('data', () => {
// But no state is being set here
// Component won't re-render!
});
}, []);
Solution: Use a Dummy State or a Reducer
For Functional Components:
Use a dummy useState or useReducer to trigger a re-render manually.
const [, forceUpdate] = useReducer(x => x + 1, 0);
useEffect(() => {
const handleUpdate = () => forceUpdate();
someObservable.on('data', handleUpdate);
return () => someObservable.off('data', handleUpdate);
}, []);
For Class Components:
Use the this.forceUpdate() method.
componentDidMount() {
this.listener = () => this.forceUpdate();
someObservable.on('data', this.listener);
}
componentWillUnmount() {
someObservable.off('data', this.listener);
}
Pros and Cons
Pros:
-
Allows you to integrate with non-React state sources (such as external stores or event emitters).
-
Simple and effective for one-off triggers without adding unnecessary state variables.
-
Avoids cluttering the component with meaningless state just to trigger re-renders.
Cons:
-
Not very declarative, you’re bypassing React’s usual state/data flow.
-
Overuse may indicate architectural issues; consider refactoring or using a proper state management solution.
-
Using forceUpdate() in class components is considered a last resort and can lead to harder-to-maintain code.
Developer Tip:
If you’re frequently forcing re-renders, consider whether your component structure or state management approach needs an update. React Context, Zustand, Redux, or even custom hooks may offer a cleaner solution.