Вот это смущает... зачем снаружи внутрь передавать, если изнутри наружу получаем? В таком кейсе Tabs отвязаны от внешнего контента и просто передают свой активный элемент... и можно управлять чем угодно снаружи
Логическая цепочка принадлежности компонентов
Что делает Tabs: Отображает визуальные компоненты(Tab), добавляет стилизацию активной вкладке.
Что делает animController: Управляет стилизацией визуального компонента(Slide), собирает о нем данные(offsetWidth) и устанавливает активную вкладку
Имеет ли Tabs какую либо связь с Slide: Только косвенную - потому что в Tabs тригерится родитель который анимирует Slide.
Имеется ли надобность Tabs понимать что происходит в animController? По сути нет, передача функции в данном случае - просто делает небольшую явную связь в коде между сменой вкладки и анимацией Slide
Можно ровно также вместо декларативного changeTab менять activeTab и в реактивном выражении по изменению activeTab вызывать animController