В разных фреймворках роль компонентов немножко разная.
Но в целом следует соблюдать solid, компонент должен делать что-нибудь одно, иметь лаконичный интерфейс, расширяться через обертки и общаться только с ближайшими сущностями.
Сверхспособность правильно делить приложение на компоненты придет только с практикой. Пока можно стремиться к "чем проще компонент, тем лучше", особенно это характерно для реакта.