Separate components are usually ideal from maintenance perspective. This aligns with the recommendation from the MobX team as well.
I have found that having too many files with tiny components often becomes unwieldy so I usually group components into modules and have many components in a file. Non-reusable components are explicitly marked as @private even if they are exported for unit-testing.
I try to prefer stateless components, but in practice many of my components end up being classes either because I need dependency injection through Inversify injected properties, or because I need custom optimisations in shouldComponentUpdate.
It would be ideal if you can use Immutable through and through and be able to just rely on shallow comparisions. I can not currently afford to do so due to myriad integrations with legacy ui components, charting libraries etc.