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.