Вы почти ответили сами на свой вопрос.
Реализуйте абстрактные компоненты, будь то формы или таблицы с настраиваемым функционалом (необходимые параметры передавайте в компонент инпутом, колбеки возвращайте оутпутом)
Если требуются уникальные случаи абстрактных компонентов - наследуйтесь от ранее созданных и уже реализуйте уникальную часть для них.
В итоге у Вас получится один абстрактный компонент. скажем, для таблиц где Вы прогоните все параметры, пришедшие из родительского компонента и отрендерите его, постепенно будете дописывать общие компоненты по мере необходимости.
В конце концов будут настраиваемые компоненты модалок, нотификаторов, аплоадеров, таблиц, форм и т.д. Которые заинкапсулируют в себе весь необходимый функционал и принимающие лишь настройки для тех или иных случаев реализаций.