docs/docs/cn/plugin-development/client/examples/custom-field.md
在 NocoBase 中,字段组件用于表格和表单中展示和编辑数据。这个示例展示怎么用 ClickableFieldModel 做一个自定义的字段展示组件——在字段值两侧加上方括号 [],并绑定到 input 类型的字段接口上。
:::tip 前置阅读
建议先了解以下内容,开发时会更顺畅:
load() 生命周期tExpr() 延迟翻译的用法:::
我们要做的是一个自定义字段展示组件:
ClickableFieldModel,自定义渲染逻辑[] 显示bindModelToInterface 绑定到 input(单行文本)类型的字段启用插件后,在表格区块里找到一个单行文本字段的列,点击列的配置按钮,在「字段组件」下拉菜单中就能看到 DisplaySimpleFieldModel 选项。切换过去后,该列的值会以 [value] 格式显示。
完整源码见 @nocobase-example/plugin-field-simple。如果你想直接在本地跑起来看效果:
yarn pm enable @nocobase-example/plugin-field-simple
下面从零开始,一步步搭建这个插件。
在仓库根目录执行:
yarn pm create @my-project/plugin-field-simple
详细说明见 编写第一个插件。
新建 src/client-v2/models/DisplaySimpleFieldModel.tsx。这是插件的核心——定义字段怎么渲染,以及绑定到哪种字段接口。
// src/client-v2/models/DisplaySimpleFieldModel.tsx
import React from 'react';
import { ClickableFieldModel } from '@nocobase/client-v2';
import { DisplayItemModel } from '@nocobase/flow-engine';
import { tExpr } from '../locale';
export class DisplaySimpleFieldModel extends ClickableFieldModel {
public renderComponent(value: string) {
// this.context.record 可以拿到当前行的完整记录
console.log('当前记录:', this.context.record);
console.log('当前记录 index:', this.context.recordIndex);
return <span>[{value}]</span>;
}
}
// 设置在「字段组件」下拉菜单里的显示名
DisplaySimpleFieldModel.define({
label: tExpr('Simple field'),
});
// 绑定到 'input'(单行文本)类型的字段接口
DisplayItemModel.bindModelToInterface('DisplaySimpleFieldModel', ['input']);
几个关键点:
renderComponent(value) — 接收当前字段的值作为参数,返回渲染的 JSXthis.context.record — 获取当前行的完整数据记录this.context.recordIndex — 获取当前行的索引ClickableFieldModel — 继承自 FieldModel,带有点击交互能力define({ label }) — 设置在「字段组件」下拉菜单里的显示名,不加的话会直接显示类名DisplayItemModel.bindModelToInterface() — 把字段模型绑定到指定的字段接口类型(比如 input 表示单行文本字段),这样在对应类型的字段上就能选择这个展示组件编辑插件的 src/locale/ 下的翻译文件,把 tExpr() 用到的 key 加上翻译:
// src/locale/zh-CN.json
{
"Simple field": "简单字段"
}
// src/locale/en-US.json
{
"Simple field": "Simple field"
}
:::warning 注意
初次添加语言文件需要重启应用才能生效。
:::
关于翻译文件的写法和 tExpr() 的更多用法,详见 i18n 国际化。
编辑 src/client-v2/plugin.tsx,用 registerModelLoaders 按需加载模型:
// src/client-v2/plugin.tsx
import { Plugin } from '@nocobase/client-v2';
export class PluginFieldSimpleClient extends Plugin {
async load() {
this.flowEngine.registerModelLoaders({
DisplaySimpleFieldModel: {
loader: () => import('./models/DisplaySimpleFieldModel'),
},
});
}
}
export default PluginFieldSimpleClient;
yarn pm enable @my-project/plugin-field-simple
启用后,在表格区块里找到一个单行文本字段的列,点击列的配置按钮,在「字段组件」下拉菜单中就能切换到这个自定义展示组件。
这个示例用到的能力:
| 能力 | 用法 | 文档 |
|---|---|---|
| 字段渲染 | ClickableFieldModel + renderComponent(value) | FlowEngine → 字段扩展 |
| 绑定字段接口 | DisplayItemModel.bindModelToInterface() | FlowEngine → 字段扩展 |
| 模型注册 | this.flowEngine.registerModelLoaders() | Plugin 插件 |