Start here. This is the direct spoken answer to practice first.
Why this question matters
Reducers are valuable when complexity comes from related transitions, not merely because a component has several values. The decision is about making state rules explicit and keeping invalid combinations out.
I use separate useState values when they change independently and their updates are easy to understand. I reach for useReducer when one event changes several related fields, transitions need names, or the next state depends on the current state in several places. The component dispatches an event such as submitted, succeeded, or failed, and the reducer returns the next immutable state. That gathers transition rules in one place without making the state global.