Сделай свои компоненты под каждый тип поля : 1. my-text-field component 2.my-select component 3. radio component. В my-text-field могут быть props, например: rules, validate, autocomplete, которые позволят расширить компонент и придумать фичи. Теперь про эвенты. Например, компонент my-text-field, в нем в data создаешь value: null. Вешаешь watch на этот инпут, а в методе вотчера кидаешь внутренний эвент компоненту выше.
Пример, как бросить эвент родительскому компоненту :
//ChildLolComponent
methods:{
lol(){
this.$emit('lolEvent', this.lol)
}
}
Пример, как поймать эвент поймать эвент в родительском компоненте:
//ParentLolComponent
<lol @lolEvent="название_вашего_метода_для_принятия_данных" />
Теперь про родительский компонент.
Создай компонент base-form, в нем укажи props с названием formFields. Туда передай массив объектов, где каждый объект это поле.
Например объект под
formFields: [
{
name: 'my_field',
class: 'moi_class',
type: 'input',
component: 'my-text-field'
id: 'moi_id',
}
];
Вот, в props это все дело передал, распарсил как тебе надо в created() методе компонента ( ну подготовил данные как тебе под вывод). Ну а дальше идешь в base-form.vue, там делаешь что-то подобное:
//this.$emit(changeData, value) -- предположим эвент будет называть changeData
<div v-for="field in parsedFields">
<component :is="field.component" @changeData="НАЗВАНИЕ_МЕТОДА_КОТОРЫЙ_БУДЕТ_ПРИНИМАТЬ_В_СЕБЕ_ЗНАЧЕНИЕ">
</div>
Постарался примерно объяснить, времени особо нет, чтобы долго объяснять, надеюсь примерно понял, если нужна будет помощь - пиши.)