fform


Flexibile form (fform) — построитель форм с минимальной избыточностью кода, при этом максимально гибкий и расширяемый. Используемый стэк технологий: React (v16), Redux (опционально), JSONSchema, TypeScript. Основная идея — максиально возможное повторное использование схем, компонентов и функций.


Особенности


  • 98kb минифицированный, 28kb сжатый
  • Конструктор форм для быстрого старта
  • Комбинирование и переиспользование форм или их частей при использовнии свойств oneOf, allOf, $ref
  • Валидация sync/async/JSON/submit
  • Нативная поддержка redux, но возможно использовать любое другое хранилище (в т.ч. внутреннее)
  • Полная поддержка массивов (добавление/удаление/перемещение)
  • Встроенный просмотрщик
  • Полностью настраиваемые и добавляемые элементы формы
  • Поддержка SSR
  • Без зависимостей (React как внешняя)

Так как по спецификации JSONSchema определяется данными только в формате JSON, в fform форма задаётся 2-мя объектами:


  • схема JSONSchema (draft v4, с дополнительными свойствами), содержащая только JSON-данные и описывающая поля формы и расположение объектов вроде кнопок, ссылок, табов и т.п.
  • объект elements, содержащий компоненты React(v16), функции, часто используемые части компонентов и, в принципе, любой другой js или JSON код, на который есть возможность ссылаться как из любой части объекта elements так и из расширенных полей объекта JSONSchema. В своей сути, elements — это хранилище кирпичиков кода из которых потом собирается вся форма, причем степень элементарности этих кипричиков определяется самим разработчиком.

Гибкость, расширяемость и повторное применение готовых схем, компонентов и функций реализуется следующим образом:


  • Расщирение схем при использовании свойств $ref и allOf так, как это описано в спецификации JSONSchema. Ссылка на пример.
  • Расширение объекта elements при использовании схожего принципа, но с другим синтаксисом (чтобы визуально различать где расширяется схема, а где elements). Документация. Ссылка на пример.
  • Обработчики данных и событий используют конвеер(pipes) из js-функций примерно так, как это сделано в linux. Выход одной функции подается на вход следующей, что (при правильном разделении ответственности функций) позволяет переиспользовать уже существующими функции, а новые добавлять только если требуется еще не реализованная функциональность. Документация. Ссылка на пример.

Ссылки


Комментарии (7)


  1. Carduelis
    04.09.2019 16:25

    Построитель форм есть, а результатор есть?
    Как кейс — это модератор загружает все килобайты в админке, а просто пользователь использует только часть библиотеки для заполнения форм.


    Вообще работа гигантская, конечно. Очень круто.


    1. wtnm7 Автор
      05.09.2019 11:14

      Не совсем понял, что должен делать результатор. Килобайты чего загружает модератор, схемы форм, разные данные одной формы, данные разных форм?


  1. VolCh
    05.09.2019 08:59
    +1

    Очень не хватает пользовательской, скажем так документации. Хотя бы описания того, что происходит в примерах, не говоря об архитектурных принципах. Или предполагается, что потенциальный пользователь хорошо знаком с какими-то конкурентами и конкретными технологиями?


    Ну и для простейшеq формы выражение типа {"$_ref":"^/parts/Submit","children":["Send"]}в поле ввода конструктора(!) очень отпугивает. Я так сходу и не определю, а что это собственно такое, селектор какой-то?.. Кто целевой пользователь этого конструктора.



  1. Balyk
    05.09.2019 15:38

    А автор видел этот проект? Там всё описанное уже есть — без fform
    github.com/rjsf-team/react-jsonschema-form


    1. wtnm7 Автор
      05.09.2019 15:38

      Видел. Всего описанного там нет.


  1. v1vendi
    05.09.2019 19:48

    Автор сделал грандиозную работу, и классно что выложил в оупенсорс, но должен согласиться с предыдущим комментатором, в react-jsonschema-form именно для построения форм на основе схемы API приятнее и лаконичнее