You can do this pretty simply with hooks and reducers, where the reducer/dispatch are the model/controller.
Class components have their own pitfalls when you start messing around with componentDidUpdate, which was part of the motivation behind functional components IIRC.
Not everyone likes hooks. Class components may have issues, but if hooks are the solution I'll stay with class components, thank you very much!
I will say that I used to really not like hooks and that’s because I think the migration documentation and messaging was handled pretty poorly.
That being said, if you’ve worked with state management like Redux, I would argue that hooks are pretty similar to how you hook up that kind of data store.
Yeah, Redux is another big mistake I stayed away from. "Line after line of throat clearing and pseduostructure", as one developer put it [1]
[1] https://news.ycombinator.com/item?id=15342764