1、概述
组件开发主要是由几4大模块构成,每个模块负责不同的分工,相互搭配构建成一个完整的可编辑组件。
1、default-setting 模块,组件基础信息配置。
2、template 模块,负责编辑器舞台的组件注册、渲染。
3、setting 模块,负责编辑器舞台组件相关设置面板注册、渲染。
4、main 模块,负责渲染引擎组件注册、渲染。
2、模块介绍
1、default-setting模块
组件的默认设置,包含组件的基础设置,元素设置,内置页设置等组件基础信息。
1、元素配置
元素配置是组件构建的核心配置,所有的组件都依赖元素配置生成对应编辑器,渲染引擎的组件。
元素的配置分为元素的公用配置信息,私有元素配置。
1、元素配置列表
1、元素公用配置
属性 | 说明 | 类型 |
---|---|---|
name | 元素名称,可供编辑器显示用 | string |
key | 可编辑元素的英文标识,可用于代码编程 | string |
type | 可编辑元素类型 | ElementTypes |
style | 元素的样式 | Object | undefined |
isDisableControllable | 是否可控制显示或隐藏 | boolean | undefined |
parentName | 元素所属的组件名或内置页名 | string | string[] | undefined |
isScale | 是否可以缩放大小 | boolean | undefined |
isDisableClick | 是否有点击事件 | boolean | undefined |
isDisableDraggable | 是否可拖拽 | boolean | undefined |
isDisableRotable | 是否可旋转 | boolean | undefined |
isDisableImageReplaceable | 图片是否可替换,一些占位图是不能替换的 | boolean | undefined |
isDisableTextReplaceable | 文本是否可替换do | boolean | undefined |
isDisableAnimation | 是否禁用动画 | boolean | undefined |
isDisableTextBtn | 是否禁用文字按钮,即仅图片按钮(仅对按钮元素有效) | boolean | undefined |
isDisableFontSetting | 是否禁用字体设置(有些动态来源的文本内容,如微信昵称,无法切割字体,需要禁用掉组件面板上的字体设置) | boolean | undefined |
anchorsType | 编辑状态锚点的类型:为空则表示没有锚点,不能改变大小 'nw n ne e se s sw w' 代表组件编辑框的8个锚点 | string | undefined |
hiddenWhenNoNickname | 当获取不到微信昵称时,是否隐藏默认文字(仅对微信昵称元素有效) | boolean | undefined |
2、元素私有配置信息
元素名称枚举 | ||||||||||||||||||||||
import ElementTypes from "@fe-plugin/components/lib/constants/element-types"; | ||||||||||||||||||||||
元素名称 | 元素私有配置 | |||||||||||||||||||||
按钮 ElementTypes.BTN |
| |||||||||||||||||||||
文本 ElementTypes.TEXT | ||||||||||||||||||||||
图片 ElementTypes.IMAGE | ||||||||||||||||||||||
表单选项 ElementTypes.CHOOSE | ||||||||||||||||||||||
表单输入框 ElementTypes.INPUT | ||||||||||||||||||||||
表单文本域 ElementTypes.TEXTAREA | ||||||||||||||||||||||
表单提交 ElementTypes.SUBMIT | ||||||||||||||||||||||
文件上上传 ElementTypes.FILEUPLOADER | ||||||||||||||||||||||
表单下拉框 ElementTypes.SELECT | ||||||||||||||||||||||
弹窗 ElementTypes.DIAGLOG | ||||||||||||||||||||||
形状 ElementTypes.SHAPE | ||||||||||||||||||||||
微信头像 ElementTypes.WXPORTRAIT | ||||||||||||||||||||||
微信昵称 ElementTypes.WXNICKNAME |
default-setting 配置示例
//包含一个按钮 和 一个内置页的组件 const defaultSetting = { name: "testCmp", title: "测试组件", inlinePages:[ { name: "INLINE_PAGE_A", title: "这是内置页", style: {}, cover: "https://static.h5no1.com/rp/plugin/assets/a19e096f-89b8-4f15-8187-09db7a3c86f0", } ], elements:[ { key: "BTN_A", name: "按钮", type: "btn", label: "确定", style: { position: "absolute", left: 42, top: 353, width: 235, height: 39, backgroundColor: "rgba(224,47,36,1)", borderRadius: 20, fontSize: 15, fontWeight: 600, color: "rgba(255,255,255,1)", }, parentName: "testCmp", }, ], cover:"https://static.h5no1.com/rp/plugin/assets/85becc30-ccb4-41b2-ad75-9bfa9447e587", style: { width: 293, height: 408, backgroundColor: "#fff", }, hasComponentSetting: true, };
1、ComponentDefaultSetting 默认设置
属性 | 说明 | 类型 |
---|---|---|
name | 组件英文名,唯一 | string |
title | 组件中文描述 | string |
cover | 组件封面图 | string |
style | 组件自身的样式 | Object | undefined |
inlinePages | 组件内置页列表 | ComponentInlinePage[] |
elements | 组件内部可编辑元素列表,能够被编辑器识别的原子组件 | ComponentElementModel[] |
hasComponentSetting | 组件是否有需要在编辑器右侧设置面板中加载的 setting 配置 | boolean | undefined |
componentBgVisible | 组件是否支持隐藏背景,当为false时才隐藏背景,undefined不隐藏 | boolean | undefined |
isDisableClientRect | 是否可以设置宽高(编辑器会禁止自适应宽高) | boolean | undefined |
3、BaseCmp 可编辑元素设置
4、ComponentInlinePage 内置页设置
元素 | 说明 | 类型 |
---|---|---|
name | 内置页英文名 | string |
title | 内置页标题 | string |
cover | 内置页封面图 | string |
style | 内置页样式 | Object | undefined |
anchorsType | 编辑状态锚点的类型:为空则表示没有锚点,不能改变大小 'nw n ne e se s sw w' 代表组件编辑框的8个锚点 | string | undefined |
height | 内置页高度 | number | undefined |
1、上下文
概述:
渲染模块中会有对应的render方法将组件逻辑渲染出来,最终注册到编辑器、渲染引擎使用。但组件的构建需要依赖default-setting、用户信息等数据支持,所以在构建组件之前需要创建一个上下文,提供此类数据给组件使用。
1、DependencyContext 上下文
上下文 | 创建 | 说明 |
---|---|---|
DependencyContext | React.createContext | 组件配置上下文 |
注意:
DependencyContext只能提供给template、setting模块相关组件使用(main模块为PReact构建,所以无法正常调用)。
template模块中,还需要对可编辑组件,和可编辑元素进行对应的上下文注入。
2、withDependencyContext 高阶组件
main模块使用withDependencyContext方法进行上下文关联
3、示例
1、上下文的注入可查看各个模块创建详细示例,
2、组件中上下文的获取可查看各个模块组件创建详细示例
2、main模块
main模块负责组件H5端的渲染。
1、CompoentMainModule基础类
提供模块加载渲染的基础方法。
属性 | 说明 |
---|---|
config | 组件配置信息 |
方法 | 说明 |
static getVisible | 静态方法,返回此组件是否可见 |
parseConfig | 解析基础配置 |
render | 组件渲染 |
destroy | 组件销毁 |
2、MainModule模块类
main模块类的创建需继承CompoentMainModule,并提供render方法进行渲染。
3、registryComponentMain方法
将模块注册到渲染引擎,提供调用。
4、withDependencyContext
使用此方法关联模块上下文,使模块中组件能够获取到上下文环境(上下文)。
5、代码示例:
import { ComponentMainModule, registryComponentMain, } from "@fe-plugin/common/lib/component-main"; // main模块创建 class MainModule extends CompoentMainModule { //返回值可控制组件是否可见(不提供此方法组件默认显示) static async getVisible(config) { return true; } //解析配置(不提供此方法配置解析为初始化设置) parseConfig(data) { const config = super.parseConfig(data); //在此可对默认配置进行额外操作 return config; } // 渲染组件 render() { super.render(); //直接使用config配置 console.log(this.config); //进行渲染 } } //将渲染的组件登录到编辑器 export default registryComponentMain("组件名称", MainModule);
3、template模块
template模块负责组件在编辑器舞台中的渲染。
1、ComponentTemplateModule基础类
提供模块加载渲染的基础方法。
属性 | 说明 |
---|---|
config | 组件配置信息 |
方法 | 说明 |
parseConfig | 解析基础配置 |
render | 组件渲染调用 |
update | 组件更新调用 |
updateElement | 元素更新调用 |
destroy | 组件销毁调用 |
2、TemplateModule模块类
类的创建的需继承ComponentTemplateModule,并提供render方法进行渲染。
注意:TemplateModule模块类中必须提供 getDefaultSetting 静态方法,否则编辑器无法获取配置(详看示例)。
3、registryComponentTemplate方法
将模块注册到编辑器,提供调用。
4、DependencyContext上下文
关联模块上下文,使模块中组件能够获取到上下文环境(点击跳转上下文介绍)。
5、组件的上下文注入
使用DependencyContext对可编辑组件,和可编辑元素进行对应的上下文注入。
import { ComponentTemplateModule, registryComponentTemplate, } from "@fe-plugin/common/lib/component-template"; import { createModel } from "@fe-plugin/components/lib/templates/models"; import defaultSetting from "app/default-setting"; //创建模块 class TemplateModule extends ComponentTemplateModule { // 获取配置(必须提供此静态方法,否则编辑器无法获取到配置) // 编辑器在加载组件的时候会调用此方法 static getDefaultSetting() { const data = { ...defaultSetting, elements: [], }; defaultSetting.elements.forEach((el) => { const model = createModel(el.type, el); data.elements.push(model); }); return data; } //解析配置(不提供此方法则返回默认配置) parseConfig(data) { const config = super.parseConfig(data); //在此可对默认配置进行额外操作 return config; } // 创建渲染 入口 render() { super.render(); // 使用config console.log(this.config); //进行渲染 } } export default registryComponentTemplate("组件名称", TemplateModule);
3、setting模块
template模块负责组件在编辑器舞台中的渲染。
1、ComponentSettingModule基础类
提供模块加载渲染的基础方法。
属性 | 说明 |
---|---|
config | 组件配置信息 |
formValue | 表单数据 |
formPass | 是否通过校验 |
方法 | 说明 |
parseConfig | 解析基础配置 |
initializeStore | 初始化 store ,给该组件提供数据源 |
render | 玩法配置渲染,编辑器中央区域玩法配置(暂时不开放) |
renderCmp | 组件配置渲染,编辑器右侧组件配置 |
validate | 校验方法 |
destroy | 组件销毁 |
2、SettingModule模块类
类的创建的需继承ComponentSettingModule,并提供renderCmp方法进行渲染。
3、registryComponentSetting方法
将模块注册到编辑器,提供调用。
4、DependencyContext上下文
关联模块上下文,使模块中组件能够获取到上下文环境(点击跳转上下文介绍)。
import { ComponentSettingModule, registryComponentSetting, } from "@fe-plugin/common/lib/component-setting"; //setting模块创建 class SettingModule extends ComponentSettingModule { //解析配置(不提供此方法则返回默认配置) parseConfig(data) { const config = super.parseConfig(data); //在此可对默认配置进行额外操作 return config; } // 渲染编辑器右侧组件设置面板 renderCmp(container, componentInfo, onChange) { super.renderCmp(container, componentInfo, onChange); //进行渲染 } // 校验设置是否通过(不提供此方法默认校验通过) validate() { this.setShowValidErr(); if (!this.formPass) return false; const componentInfo = getComponentInfo(this.config); // 同步组件setting里的配置,在编辑器中再次打开设置弹窗的时候,可以直接回显 this.config.set("componentInfo.props", this.formValue); return { ...componentInfo, props: this.formValue }; } } //进行设置 注册 export default registryComponentSetting("组件名称", SettingModule);