I don’t think it’s dishonest. There’s two main phases in react, render and commit.
Render is interruptible. For example when a new event like an interaction comes in, the in progress render might get chucked out and restarted with the new information.
Commit isn’t interruptible. It’s a sync phase. This is where all the effects run, and the purpose is to take the new state from the render phase and synchronise it to the external systems. Aka cause side effects.
The useEffect hook running in the commit phase, does let you step outside of the react framework. It lets you safely interact with external systems. If you tried to do any of that in the render phase, you risk getting cut off halfway, or doing things out of order.
> React is not a "pure view library" that you have to integrate with state management.
A view library without state management would be a templating engine right?
> It makes you handle the extremely impure chain of (route change, component "mounting", data fetching...), all in the rendering code.
It lets you define how to respond to those changes in the render phase, but they aren’t applied until the commit phase.
And that means you can wrap up the complexity in well tested components that provide a simple API.