Faire un composant de champ personnalisé
Dans NocoBase, les composants de champ servent à afficher et éditer les données dans les tableaux et formulaires. Cet exemple montre comment créer un composant d'affichage de champ personnalisé avec ClickableFieldModel — il ajoute des crochets [] autour de la valeur du champ et est lié à l'interface input.
Il est conseillé de connaître les contenus suivants pour faciliter le développement :
- Écrire votre premier plugin — création d'un plugin et structure du répertoire
- Plugin — point d'entrée du plugin et cycle de vie
load() - Aperçu de FlowEngine — utilisation de base de FlowModel
- FlowEngine → Extension de champ — présentation des classes parentes FieldModel et ClickableFieldModel
- Internationalisation i18n — écriture des fichiers de traduction et utilisation de
tExpr()pour la traduction différée
Résultat final
Nous allons créer un composant d'affichage de champ personnalisé :
- Étend
ClickableFieldModelavec une logique de rendu personnalisée - Affiche
[]autour de la valeur du champ - Lie le composant à l'interface
input(texte sur une ligne) viabindModelToInterface
Une fois le plugin activé, dans un bloc tableau, trouvez la colonne d'un champ texte sur une ligne, cliquez sur le bouton de configuration de la colonne et, dans le menu déroulant « Composant de champ », vous verrez l'option DisplaySimpleFieldModel. En basculant dessus, la valeur sera affichée au format [value].
Code source complet : @nocobase-example/plugin-field-simple. Pour le faire tourner directement en local :
Construisons ce plugin pas à pas, à partir de zéro.
Étape 1 : créer le squelette du plugin
À la racine du dépôt :
Voir Écrire votre premier plugin pour les détails.
Étape 2 : créer le modèle de champ
Créez src/client-v2/models/DisplaySimpleFieldModel.tsx. C'est le cœur du plugin — il définit le rendu du champ et l'interface à laquelle il est lié.
Quelques points clés :
renderComponent(value)— reçoit la valeur courante du champ en paramètre et renvoie le JSXthis.context.record— récupère l'enregistrement complet de la ligne courantethis.context.recordIndex— récupère l'index de la ligne couranteClickableFieldModel— étendFieldModelavec la capacité d'interaction au clicdefine({ label })— définit le nom affiché dans le menu déroulant « Composant de champ » ; sans ce label, le nom de classe serait affiché à la placeDisplayItemModel.bindModelToInterface()— lie le modèle de champ à un type d'interface de champ (par exempleinputpour les champs texte sur une ligne) ; ce composant d'affichage devient alors sélectionnable sur les champs du type correspondant
Étape 3 : ajouter les fichiers de traduction
Modifiez les fichiers de traduction sous src/locale/ du plugin et ajoutez les clés utilisées par tExpr() :
L'ajout initial des fichiers de langue nécessite un redémarrage de l'application pour prendre effet.
Pour l'écriture des fichiers de traduction et plus d'utilisations de tExpr(), voir Internationalisation i18n.
Étape 4 : enregistrer dans le plugin
Modifiez src/client-v2/plugin.tsx et utilisez registerModelLoaders pour le chargement à la demande :
Étape 5 : activer le plugin
Une fois activé, dans un bloc tableau, trouvez la colonne d'un champ texte sur une ligne, cliquez sur le bouton de configuration de la colonne et, dans le menu déroulant « Composant de champ », vous pourrez basculer vers ce composant d'affichage personnalisé.
Code source complet
- @nocobase-example/plugin-field-simple — exemple complet de composant de champ personnalisé
Récapitulatif
Capacités utilisées dans cet exemple :
Liens connexes
- Écrire votre premier plugin — créer le squelette d'un plugin de zéro
- Aperçu de FlowEngine — utilisation de base de FlowModel
- FlowEngine → Extension de champ — FieldModel, ClickableFieldModel, bindModelToInterface
- FlowEngine → Extension de bloc — bloc personnalisé
- Component vs FlowModel — quand utiliser FlowModel
- Plugin — point d'entrée et cycle de vie load()
- Internationalisation i18n — écriture des fichiers de traduction et utilisation de tExpr
- Documentation complète FlowEngine — référence complète FlowModel, Flow, Context

