Я считаю, что лучшим вариантом будет комбинация этих двух подходов. Функциональными должны быть компоненты, которые отвечают только за отображение интерфейса, класссовыми - компоненты, которые являются корневыми, где хранятся методы обработки событий и, если нужно, состояние