Как объявлять компоненты в React?
Классовые компоненты никуда не уходят. Для них осталось несколько удобных кейсов. Например:
1. Удобное получение предыдущих значений свойств и состояний в componentDidUpdate.
2. Доступ к экземпляру компонента в хандлерах, передаваемых в браузерные API.
3. Сложные компоненты с большим количеством методов. Например VideoPlayer.
Производительность может и отличается, но вы и ваши пользователи это вряд ли заметите. Стоит понимать, что инициализация хуков и переопределение всех колбеков в функциональных компонентах при перерисовке - операция позатратней, чем вызов render классового компонента у которого все хандлеры определены за пределами render в свойствах экземпляра или в прототипе. Поэтому если в теле функционального компоннета много чего происходит, то, возможно, его стоит переписать в классовый, ну или по возможности вынести из него логику, тут в помощь кастомные хуки.
Оптимизация это отдельный вопрос, которому стоит посвятить время. Сейчас разве стоит предупредить вас, что преждевременная оптимизация - зло.
Попробуйте использовать в коде преимущественно функциональные компоненты и хуки. Сейчас почти все популярные библиотеки имеют в API довольно удобные в использовании хуки. Там, где покажется, что будет удобней использовать класс, не бойтесь использовать классы.
Иногда классы все-равно нужны. Потому для того, чтобы код был в едином стиле - всегда использую классы.