Both useState and useRef store values in a component, but they are used for very different purposes.
πΉ useState
What it does
- Stores state that affects UI
- Triggers re-render when updated
- Used for dynamic data shown on screen
Example
const [count, setCount] = useState(0);
setCount(count + 1); // re-renders component
Use cases
β Form inputs
β Counters
β API data
β Toggle UI
πΉ useRef
What it does
- Stores a mutable value
- Does NOT trigger re-render
- Persists value across renders
Example
const countRef = useRef(0);
countRef.current += 1; // no re-render
Use cases
β DOM access
β Previous values
β Timers & intervals
β Mutable flags
π₯ Key Differences
| Feature | useState | useRef |
|---|---|---|
| Causes re-render | β Yes | β No |
| Value change visible in UI | β | β |
| Mutable | β (immutable updates) | β |
| Access via | value | .current |
| Persists across renders | β | β |
π§ͺ Real Example
function App() {
const [count, setCount] = useState(0);
const renderCount = useRef(0);
renderCount.current++;
return (
<div>
<p>Count: {count}</p>
<p>Renders: {renderCount.current}</p>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
);
}
π― Short Interview Answer
useStateis used for data that affects rendering and triggers a re-render when updated, whileuseRefstores mutable values that persist across renders without causing re-renders.
β One-line summary
useState updates UI, useRef stores values without re-rendering.