UNPKG

vuetify-schema-form

Version:
69 lines (61 loc) 5.94 kB
## Введение vuetify-schema-form может использоваться двумя способами: 1) просто как набор часто используемых компонентов. В этом случае нужные компоненты нужно подключать из папки /src/components 2) или же можно ее использовать, как более удобный (по крайней мере для меня) построитель сложных форм. В этом случае форма строится не по html-разметке, а по JS-объекту Например, хотим построить форму с вкладками? Пишем вот такую структуру и передаем ее на вход либы: fields: { type: 'tabs', fields: [{ label: 'Основная информация', type: 'row', fields: [{ type: 'row', md: 8, fields: [ { label: 'Фамилия', value: 'secondName', md: 3, required: true }, { label: 'Имя', value: 'firstName', md: 3, required: true }, { label: 'Отчество', value: 'middleName', md: 3, required: true } ] }, { type: 'row', md: 4, fields: [{ label: 'Телефоны', value: 'phones', type: 'array', containerProps: { noGutters: true }, inputType: 'phone', inputProps: { cols: 12 }, required: true, noGutters: true } ] }] }, { label: 'Файлы', type: 'row', fields: [{ label: 'Файлы', value: 'files', type: 'files', foreignKey: 'driverId', foreignKeyValue: () => this.id }] }] } ## Особенности - Уменьшает объем кода, который надо написать по следующим причинам: 1) разворачивает некоторые пропсы во Vue-компоненты: к примеру, дети элемента 'row' оборачиваются элементом \<v-col>. 2) Проперти required: true у элементов превращается в правило с required-валидацией 3) Нет необходимости каждый раз импортировать нужные элементы (это, конечно, и минус, скорее всего, так как увеличит размер бандла) - Имеет множество частоиспользуемых компонентов. Напишу только про самые сложные, а остальные можно увидеть в исходнике: 1) 'remote' -- автокомплит по связанной сущности. Поддерживает поиск или выгрузку всех элементов при создании компонента 2) 'file' и 'files' -- сложные элементы и совсем без возможности кастомизации. Работали только в связке с koa-file-uploader-router на сервере. Могут принимать те же пропсы, что и другие компоненты. Особенные пропсы: `params` 'file') -- объект, позволяющий связать данный файл с сущностью в другой таблице. К примеру, нужно связать загружаемые файлы с водителем -- передаем сюда: params: {driverId: "some-uuid"}. Тогда файлы кокретного водителя отобразятся в форме. Необходимо, чтобы это поле (driverId) было объявлено в Хасуре в таблице File `foreignKey`, `foreignKeyType` (по умолчанию uuid!), `foreignKeyValue` -- пропсы для 'files'. Позволяют связывать файлы к сущности. Являются обязательными полями. В таблице File обязательно должно быть столбец "sort" -- сортировка в списке Я не спорю -- эти 3 компонента написаны не очень. Но мне они очень сильно упрощают жизнь 3) 'mask' -- инпут с поддержкой маски. Используется внутри элемента 'phone'. Я вынес его сюда, так как внутри 'mask' использует не v-mask какой-нибудь глючный, а Cleave.js который намного гибче, но при этом и интегрировать во Vue его сложней 4) 'array' -- тоже сложный элемент. Позволяет делать "массивы" компонентов (которые в Хасуре будут храниться в типе JSONB). Принимает проп inputType -- тип инпута из этой же либы (например, inputType: 'phone') покажет массив телефонов с возможностью добавлять новые элементы, проверять валидацию и т.д. Лучше посмотрите как на МТР реализован массив телефонов/емейлов у водилы ## Минусы - Я не уверен, что такой подход построения форм намного лучше, чем классический с шаблонами. Но мне нравится и особых проблем я пока не вижу Кастомизировать инпуты можно или добавив новый тип (см. файл useSchemaForm в МТР), или через scopedSlot: <template #item.phone="{item}"> -- где "phone" это поле _value_ из структуры, _item_ -- текущий объект формы