Создание пользовательского компонента поля
В NocoBase компонент поля используется в таблицах и формах для отображения и редактирования данных. Этот пример показывает, как с помощью ClickableFieldModel создать пользовательский компонент отображения поля — добавить квадратные скобки [] по обе стороны значения поля и привязать его к интерфейсу полей типа input.
Рекомендуется сначала ознакомиться со следующим — это упростит разработку:
- Написание первого плагина — создание плагина и структура каталогов
- Plugin (Плагин) — точка входа плагина и жизненный цикл
load() - Обзор FlowEngine — базовое использование FlowModel
- FlowEngine → Расширение полей — введение в базовые классы FieldModel, ClickableFieldModel
- i18n Интернационализация — формат файлов перевода и использование
tExpr()для отложенного перевода
Конечный результат
Мы делаем пользовательский компонент отображения поля:
- Наследует
ClickableFieldModel, кастомизирует логику рендеринга - Отображает значение поля с
[]по обе стороны - Через
bindModelToInterfaceпривязан к полям типаinput(однострочный текст)
После включения плагина в блоке таблицы найдите столбец однострочного текстового поля, нажмите кнопку настройки столбца — в выпадающем меню «Компонент поля» появится опция DisplaySimpleFieldModel. После переключения значение в столбце будет отображаться в формате [value].
Полный исходный код см. в @nocobase-example/plugin-field-simple. Если хотите запустить и посмотреть локально:
Ниже шаг за шагом построим этот плагин с нуля.
Шаг 1: создать каркас плагина
Выполните в корне репозитория:
Подробное описание см. в Написание первого плагина.
Шаг 2: создать модель поля
Создайте src/client-v2/models/DisplaySimpleFieldModel.tsx. Это ядро плагина — здесь определяется, как поле рендерится и к какому интерфейсу полей оно привязано.
Несколько ключевых моментов:
renderComponent(value)— принимает текущее значение поля как параметр, возвращает рендеримый JSXthis.context.record— получение полной записи данных текущей строкиthis.context.recordIndex— получение индекса текущей строкиClickableFieldModel— наследуетFieldModel, имеет возможность взаимодействия по кликуdefine({ label })— установка отображаемого имени в выпадающем меню «Компонент поля». Без этого будет напрямую отображаться имя классаDisplayItemModel.bindModelToInterface()— привязывает модель поля к указанному типу интерфейса поля (например,inputозначает поле однострочного текста). Так в полях соответствующего типа можно будет выбрать этот компонент отображения
Шаг 3: добавить файлы локализации
Отредактируйте файлы перевода в src/locale/ плагина, добавьте переводы для ключей, использованных в tExpr():
При первом добавлении файла языка нужно перезапустить приложение, чтобы он вступил в силу.
О формате файлов перевода и других способах использования tExpr() подробнее см. в i18n Интернационализация.
Шаг 4: зарегистрировать в плагине
Отредактируйте src/client-v2/plugin.tsx, через registerModelLoaders подгружайте модель по требованию:
Шаг 5: включить плагин
После включения в блоке таблицы найдите столбец однострочного текстового поля, нажмите кнопку настройки столбца — в выпадающем меню «Компонент поля» можно будет переключиться на этот пользовательский компонент отображения.
Полный исходный код
- @nocobase-example/plugin-field-simple — полный пример пользовательского компонента поля
Резюме
Возможности, использованные в этом примере:
Связанные ссылки
- Написание первого плагина — создание каркаса плагина с нуля
- Обзор FlowEngine — базовое использование FlowModel
- FlowEngine → Расширение полей — FieldModel, ClickableFieldModel, bindModelToInterface
- FlowEngine → Расширение блоков — пользовательские блоки
- Component vs FlowModel — когда использовать FlowModel
- Plugin (Плагин) — точка входа плагина и жизненный цикл load()
- i18n Интернационализация — формат файлов перевода и использование tExpr
- Полная документация FlowEngine — полный справочник FlowModel, Flow, Context

