Skip to Content

组件映射

Entity Engine 为每种字段类型自动选择最合适的输入组件。您也可以根据具体需求自定义字段的显示组件,比如将普通文本框改为富文本编辑器,或者为数字字段使用滑块组件。

组件映射让您可以在不修改模型定义的情况下,为不同的使用场景提供最佳的用户体验。同一个字段在不同的视图中可以使用不同的组件。

默认组件映射

每种字段类型都有默认的输入组件,适合大多数使用场景:

文本字段组件

// 单行文本 - 默认使用 textfield { name: 'title', type: 'string' // 自动使用文本输入框 } // 多行文本 - 自动使用 textarea { name: 'description', type: 'string', config: { multiline: true } // 自动使用多行文本框 } // 邮箱 - 自动使用邮箱输入框 { name: 'email', type: 'string', config: { format: 'email' } // 自动使用邮箱格式输入框 }

数字字段组件

// 基础数字 - 默认使用 number { name: 'price', type: 'number' // 自动使用数字输入框 } // 百分比 - 自动使用百分比组件 { name: 'discount', type: 'number', config: { format: 'percentage' } // 自动使用百分比输入框 }

选择字段组件

// 枚举 - 默认使用 select { name: 'status', type: 'enum', options: [ { label: '草稿', value: 'draft' }, { label: '发布', value: 'published' } ] // 自动使用下拉选择框 } // 布尔值 - 默认使用 switch { name: 'isActive', type: 'boolean' // 自动使用开关组件 }

自定义字段组件

您可以为特定字段指定使用不同的组件:

在字段定义中指定组件

// 使用富文本编辑器替代普通文本框 { name: 'content', title: '文章内容', type: 'string', widget: 'rich-text-editor' } // 使用滑块替代数字输入框 { name: 'rating', title: '评分', type: 'number', widget: 'slider', config: { min: 1, max: 10 } } // 使用单选按钮替代下拉框 { name: 'priority', title: '优先级', type: 'enum', widget: 'radio-group', options: [ { label: '低', value: 'low' }, { label: '中', value: 'medium' }, { label: '高', value: 'high' } ] }

在视图中指定组件

同一个字段在不同视图中可以使用不同的组件:

// 在表单视图中使用富文本编辑器 { modelName: 'Article', name: 'ArticleFormView', type: 'FormView', config: { fields: [ { name: 'content', widget: 'rich-text-editor' } ] } } // 在网格视图中使用简单文本显示 { modelName: 'Article', name: 'ArticleGridView', type: 'GridView', config: { columns: [ { name: 'content', widget: 'text-preview' // 只显示文本摘要 } ] } }

常用组件类型

文本输入组件

// 基础文本框 { widget: 'textfield' } // 多行文本框 { widget: 'textarea' } // 富文本编辑器 { widget: 'rich-text-editor' } // Markdown 编辑器 { widget: 'markdown-editor' } // 代码编辑器 { widget: 'code-editor' }

数字输入组件

// 数字输入框 { widget: 'number' } // 滑块 { widget: 'slider' } // 评级星星 { widget: 'rating' } // 货币输入 { widget: 'currency' }

选择组件

// 下拉选择框 { widget: 'select' } // 单选按钮组 { widget: 'radio-group' } // 复选框组 { widget: 'checkbox-group' } // 标签选择器 { widget: 'tag-select' }

日期时间组件

// 日期选择器 { widget: 'date-picker' } // 时间选择器 { widget: 'time-picker' } // 日期时间选择器 { widget: 'datetime-picker' } // 日期范围选择器 { widget: 'date-range-picker' }

文件上传组件

// 文件上传 { widget: 'file-upload' } // 图片上传 { widget: 'image-upload' } // 头像上传 { widget: 'avatar-upload' } // 拖拽上传 { widget: 'drag-upload' }

组件配置选项

不同的组件支持不同的配置选项:

富文本编辑器配置

{ name: 'content', type: 'string', widget: 'rich-text-editor', config: { toolbar: ['bold', 'italic', 'link', 'image'], placeholder: '请输入文章内容...', maxLength: 10000 } }

滑块组件配置

{ name: 'volume', type: 'number', widget: 'slider', config: { min: 0, max: 100, step: 5, showMarks: true, showValue: true } }

图片上传配置

{ name: 'avatar', type: 'binary', widget: 'image-upload', config: { accept: 'image/*', maxSize: '2MB', cropAspectRatio: 1, // 正方形裁剪 preview: true } }

标签选择器配置

{ name: 'tags', type: 'array', widget: 'tag-select', config: { allowCustom: true, maxTags: 10, suggestions: ['JavaScript', 'React', 'Vue', 'Angular'] } }

条件组件显示

根据其他字段的值来决定显示哪个组件:

{ name: 'settings', type: 'json', widget: 'dynamic-form', config: { // 根据类型字段的值显示不同的表单 dependsOn: 'type', widgets: { 'email': 'email-settings-form', 'sms': 'sms-settings-form', 'webhook': 'webhook-settings-form' } } }

自定义组件开发

当内置组件无法满足需求时,您可以开发自定义组件:

注册自定义组件

import { CustomColorPicker } from './components/CustomColorPicker'; const engine = await getEntityEngine(); // 注册自定义组件 engine.componentRegistry.registerWidget({ name: 'custom-color-picker', component: CustomColorPicker, fieldTypes: ['string'], description: '自定义颜色选择器' });

使用自定义组件

{ name: 'themeColor', title: '主题颜色', type: 'string', widget: 'custom-color-picker', config: { palette: ['#ff0000', '#00ff00', '#0000ff'], showHex: true } }

响应式组件适配

根据设备类型自动选择合适的组件:

{ name: 'description', type: 'string', widget: { desktop: 'rich-text-editor', // 桌面端使用富文本编辑器 tablet: 'textarea', // 平板使用多行文本框 mobile: 'textfield' // 手机使用单行文本框 } }

组件性能优化

延迟加载重型组件

{ name: 'content', type: 'string', widget: 'rich-text-editor', config: { lazy: true, // 延迟加载编辑器 placeholder: '点击开始编辑...' } }

组件预加载

// 在应用启动时预加载常用组件 const engine = await getEntityEngine(); await engine.componentRegistry.preloadWidgets([ 'rich-text-editor', 'image-upload', 'date-picker' ]);

组件主题定制

为组件应用不同的主题样式:

{ name: 'title', type: 'string', widget: 'textfield', config: { theme: 'primary', // 主题色 size: 'large', // 组件大小 variant: 'outlined' // 样式变体 } }

实际应用场景

内容管理系统

为不同类型的内容选择合适的编辑组件:

// 文章内容使用富文本编辑器 { name: 'content', type: 'string', widget: 'rich-text-editor' } // 摘要使用多行文本框 { name: 'summary', type: 'string', widget: 'textarea', config: { rows: 3 } } // 标签使用标签选择器 { name: 'tags', type: 'array', widget: 'tag-select' }

电商产品管理

为商品信息选择专门的组件:

// 价格使用货币输入 { name: 'price', type: 'number', widget: 'currency' } // 商品图片使用图片上传组件 { name: 'images', type: 'array', widget: 'image-gallery-upload' } // 商品评分使用星级组件 { name: 'rating', type: 'number', widget: 'rating' }

用户设置界面

为用户偏好设置选择直观的组件:

// 通知开关使用切换按钮 { name: 'emailNotifications', type: 'boolean', widget: 'switch' } // 主题选择使用单选按钮 { name: 'theme', type: 'enum', widget: 'radio-group' } // 音量设置使用滑块 { name: 'volume', type: 'number', widget: 'slider' }

通过合理的组件映射,您可以为用户提供最佳的数据输入和展示体验,让复杂的数据管理变得简单直观。

下一步

了解组件映射后,您可能想要:

Last updated on