版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

  • withEditableElement 可编辑元素高阶组件
  • 可编辑元素上下文注入(查看 context 上下文
  • 可编辑元素根据不同的元素配置进行组件渲染,可编辑元素组件列表:

可编辑元素组件(名称不固定)

基础元素组件

基础元素引用

可编辑方法

可编辑方法引用

EditableImage

Image

@fe-plugin/components/lib/templates/cmps/image

withEditableImage

可编辑方法模块

import {

withEditableImage,

withEditableButton,

withEditableText,

withEditableDialog,

withEditableInput,

withEditableTextarea,

withEditableButton

withEditableFileUploader,

...

withEditableShape

} from "@fe-plugin/components/lib/templates/editable-element";

可编辑元素组件(名称不固定)

基础元素组件

可编辑方法

EditableImage

Image

withEditableImage(key):void

EditableButton

Button

withEditableButton(key):void

@fe-plugin/components/lib/templates/cmps/button

withEditableButton

EditableText

<p>、<article>标签

原生标签

withEditableText

(key):void

EditableDialog

Dialog

@fe-plugin/components/lib/templates/cmps/dialog

withEditableDialog

(key):void

EditableRadio

EditableInput

withEditableRadio
Input@fe-plugin/components/lib/templates/cmps/input
EditableInput
withEditableInput

EditableTextarea

withEditableTextarea

EditableSubmit

withEditableSubmit
Textarea@fe-plugin/components/lib/templates/cmps/textareawithEditableTextarea

EditableFileUploader

withEditableFileUploader

EditableCheckbox

withEditableCheckbox
FileUploader@fe-plugin/components/lib/templates/cmps/file-uploaderwithEditableFileUploader

EditableShape

Shape@fe-plugin/components/lib/templates/cmps/shape

EditableSelect

withEditableSelect

EditableDialog

withEditableDialogEditableShape
withEditableShape

4、示例:

构建可编辑组件、可编辑元素

代码块
title创建编辑器可编辑组件
linenumberstrue
import React from "react";
import { withEditableComponent } from "@fe-plugin/components/lib/templates/editable-component";
import { withEditableText } from "@fe-plugin/components/lib/templates/editable-element";
import BaseButton from "@fe-plugin/components/lib/templates/cmps/button";

// 创建一个可编辑组件
const EditableComponent = withEditableComponent();

// 根据元素配置的key值创建一个可编辑元素
const EditableButton = withEditableButton("元素key值")((element) => {
  return <BaseButton data={element} style={element.style} />;
});

// 编辑器组件的渲染(一个带有可编辑按钮元素的组件)
function EditerCmpRender() {
  return (
    <EditableComponent>
      <EditableButton />
    </EditableComponent>
  );
}


2、main模块下渲染型组件创建
7
7

渲染引擎渲染组件,有main模块引用,需要与编辑器可编辑组件对应渲染,并且需要附加逻辑。

组件名称基础组件名称组件参数引入模块渲染组件引入
Button
data:ComponentElementModel element元素配置

@fe-plugin/components/lib/h5/cmps/button

Image

@fe-plugin/components/lib/h5/cmps/image

Text

@fe-plugin/components/lib/h5/cmps/text

Dialog

@fe-plugin/components/lib/h5/cmps/Dialog
Input@fe-plugin/components/lib/h5/cmps/input
Textarea@fe-plugin/components/lib/h5/cmps/textarea
FileUploader@fe-plugin/components/lib/h5/cmps/file-uploader
公共组件名称渲染组件引入
ConfirmDialog 确认弹窗

@fe-plugin/components/lib/h5/confirm-dialog

QrCode 二维码组件@fe-plugin/components/lib/h5/qrcode
示例:
代码块
title创建一个渲染按钮
linenumberstrue
import React from "react";
import Button from "@fe-plugin/components/lib/h5/cmps/button";


export default function RenderButton(props) {
  const handleClick = () => {
    console.log("处理按钮的点击事件");
  };
  //从外部到element元素数据 填充
  return <Button data={props.element} onClick={handleClick} />;
}

2、渲染

...

了解组件的类型,与创建后,不同模块最终需要对组件进行组合,形成最终的渲染。

...

1、main模块组件渲染

...

9

...

9

template、main模块中存在的弹出层模块,称之为内置页,可做组件的弹出层逻辑渲染。

...

引入main模块上下文(点击查看main模块的创建

创建渲染组件(点击查看渲染型组件创建

内置页的引用(点击查看main模块下内置页创建

示例:创建一个main组件

...

1、template组件中的内置页

内置页在template模块中创建使用可编辑型组件创建。

示例:termplate模块中内置页的创建

代码块
titletemplate模块内置页创建main组件
linenumberstrue
import React from "react";
import {
  withEditableButton,
  withEditableDialog,
DependencyContext } from "@fe-plugin/components/lib/templates/editable-elementcontext";
import { getComponentInfo } from "@fe-plugin/common/lib/component-info";
import { getElementByKey } from "@fe-plugin/common/lib/component-element";
import BaseDialog from "@fe-plugin/components/lib/templates/cmps/dialog";
import BaseButton from "@fe-plugin/components/lib/templates/cmps/button";
import * as ELEMENT_KEY from "constants/element-keys";


// 编辑器舞台编辑组件创建main组件
class InlinePageMain extends React.Component {
  // 获取上下文
  static contextType = DependencyContext;

  // 处理逻辑
  hanldeClick() {
    console.log("点击了按钮");
  }

  render() {
    // 从上上下文获取 配置
    const { config } = this.context;

    // 获取信息,并创建获取element的方法
    const componentInfo = getComponentInfo(config);
    const getElement = (type) => getElementByKey(componentInfo.elements, type);

    //return 获取弹窗元素(
    const dialogElement = getElement(ELEMENT_KEY.POPUP_DIALOG);
 <div>
    // 根据元素配置的key值创建一个可编辑元素
   <Button
 const EditableButton = withEditableDialog(ELEMENT_KEY.Button)((element) => {
      return <BaseButton data={element} style={element.style} />;
    });

    const EditableDialog = withEditableButtongetElement(ELEMENT_KEY.Dialog)((element) => {BTN_A)}
      return (
        <BaseDialog dataonClick={element}>
          <EditableButton />
        </BaseDialog>
      );
    });

    return (
  () => hanldeClickAnswerButton()}
    <Dialog name={ELEMENT_KEY.POPUP_DIALOG}>
        <EditableDialog />
      </Dialog>div>
    );
  }
}

export default InlinePageMain;


2、template模块组件渲染
10

...

2、main组件中的内置页

内置页在main模块中的创建使用渲染型组件创建。

10

引入template模块上下文(点击查看template模块的创建 

创建可编辑组件(点击查看编辑型组件创建

内置页的引用(点击查看template模块下内置页创建


示例:创建一个template组件示例:main模块中内置页的创建

代码块
title可弹出内置页渲染main组件
linenumberstrue
import React from "react";
import { DependencyContext Dialog} from "@fe-plugin/components/lib/h5/confirm-dialog/context";
import { getComponentInfo } from "@fe-plugin/common/lib/component-info";
import withPopup{ withEditableComponent } from "@fe-plugin/components/lib/h5templates/witheditable-popupcomponent";
import { getElementByKeywithEditableButton } from "@fe-plugin/commoncomponents/lib/templates/componenteditable-element";
import BaseButton from "@fe-plugin/components/lib/templates/cmps/button";
import * as ELEMENT_KEY from "constants/element-keys";


// 可弹出内置页渲染
function InlineRender(props) {
  创建一个可编辑组件
const EditableComponent = withEditableComponent();

// 获取main组件传入的参数编辑器舞台编辑组件
class Template extends constReact.Component { componentInfo, onClose, getElement }
  //获取上下文
  static contextType = propsDependencyContext;

  const// getElement渲染组件
 = renderCmp(type) => getElementByKey(componentInfo, type);

{
  return (
 //   <Dialog根据元素配置的key值创建一个可编辑元素
    const EditableButton dialog={getElement withEditableButton(ELEMENT_KEY.POPUP_DIALOG)}
Button)((element) => {
      return <BaseButton data={element} imagestyle={getElement(ELEMENT_KEY.IMAGE_B)}
  element.style} />;
    });

    return button={getElement(ELEMENT_KEY.BTN_B)}
      onClick={onClose}
<EditableComponent>
        onClose={onClose}
<div>
          <EditableButton />
        </div>
      </EditableComponent>
    );
  }
}

export default withPopup(InlineRender)Template;

3、渲染

了解组件的类型,与创建后,不同模块最终需要对组件进行组合,形成最终的渲染。

...


3、setting模块组件渲染

...

11

...

引入main模块上下文(点击查看main模块的创建

创建渲染组件(点击查看渲染型组件创建

内置页的引用(点击查看main模块下内置页创建

11

渲染setting模块需要以下步骤:

1、在default-setting中将 hasComponentSetting 设置为 true

2、在模块入口传入onChange、initValue参数,提供数据初始化,数据更改等功能(点击查看模块入口)

示例:创建一个setting组件示例:创建一个main组件

代码块
titlemain组件
linenumberstrue
import React from "react";
import { DependencyContext } from "@fe-plugin/components/lib/context";
import { getComponentInfo } from "@fe-plugin/common/lib/component-info";
import { getElementByKeywithEditableComponent } from "@fe-plugin/commoncomponents/lib/templates/editable-component";
import { withEditableButton } from "@fe-plugin/components/lib/templates/editable-element";
import BaseButton from "@fe-plugin/components/lib/templates/cmps/button";
import * as ELEMENT_KEY from "constants/element-keys";

// 创建一个可编辑组件
const EditableComponent = withEditableComponent();

//创建main组件 编辑器舞台编辑组件
class MainTemplate extends React.Component {
  // 获取上下文
  static contextType = DependencyContext;

  // 处理逻辑渲染组件
  hanldeClickrenderCmp() {
    console.log("点击了按钮");
  }

  render() {
    // 从上上下文获取 配置根据元素配置的key值创建一个可编辑元素
    const {EditableButton config }= withEditableButton(ELEMENT_KEY.Button)((element) => this.context;{

    // 获取信息,并创建获取element的方法
 return <BaseButton  const componentInfo = getComponentInfo(config)data={element} style={element.style} />;
    const getElement = (type) => getElementByKey(componentInfo.elements, type)});

    return (
      <div><EditableComponent>
        <Button<div>
          data={getElement(ELEMENT_KEY.BTN_A)}
          onClick={() => hanldeClickAnswerButton()}<EditableButton />
        </>div>
      </div>EditableComponent>
    );
  }
}

export default MainTemplate;

...



3、内置页

...

引入template模块上下文(点击查看template模块的创建 

创建可编辑组件(点击查看编辑型组件创建

内置页的引用(点击查看template模块下内置页创建

8
8

template、main模块中存在的弹出层模块,称之为内置页,可做组件的弹出层逻辑渲染。

12
12

1、template组件中的内置页

内置页在template模块中创建使用可编辑型组件创建。

示例:termplate模块中内置页的创建示例:创建一个template组件

代码块
titlemain组件template模块内置页创建
linenumberstrue
import React from "react";
import {
  withEditableButton,
 DependencyContext withEditableDialog,
} from "@fe-plugin/components/lib/templates/contexteditable-element";
import { getComponentInfo } from "@fe-plugin/common/lib/component-info";
import { withEditableComponentgetElementByKey } from "@fe-plugin/componentscommon/lib/templates/editablecomponent-componentelement";
import { withEditableButtonBaseDialog } from "@fe-plugin/components/lib/templates/editable-elementcmps/dialog";
import BaseButton from "@fe-plugin/components/lib/templates/cmps/button";
import * as ELEMENT_KEY from "constants/element-keys";

// 创建一个可编辑组件
const EditableComponent = withEditableComponent();

// 编辑器舞台编辑组件
class TemplateInlinePage extends React.Component {
  //获取上下文
  static contextType = DependencyContext;

  render() {
    const { config } = this.context;

    // 渲染组件
  renderCmp() { 获取信息,并创建获取element的方法
    const componentInfo = getComponentInfo(config);
    const getElement = (type) => getElementByKey(componentInfo.elements, type);

    // 获取弹窗元素
    const dialogElement = getElement(ELEMENT_KEY.POPUP_DIALOG);

    // 根据元素配置的key值创建一个可编辑元素
    const EditableButton = withEditableButtonwithEditableDialog(ELEMENT_KEY.Button)((element) => {
      return <BaseButton data={element} style={element.style} />;
    });

    const EditableDialog return= withEditableButton(ELEMENT_KEY.Dialog)((element) => {
      <EditableComponent>return (
         <div><BaseDialog data={element}>
          <EditableButton />
        </div>/BaseDialog>
      );
    });

    return (
      <Dialog name={ELEMENT_KEY.POPUP_DIALOG}>
        <EditableDialog />
      </EditableComponent>Dialog>
    );
  }
}

export default TemplateInlinePage;

...



...

13

...

13

渲染setting模块需要以下步骤:

1、在default-setting中将 hasComponentSetting 设置为 true

2、在模块入口传入onChange、initValue参数,提供数据初始化,数据更改等功能(点击查看模块入口)

示例:创建一个setting组件

2、main组件中的内置页

内置页在main模块中的创建使用渲染型组件创建。

示例:main模块中内置页的创建

代码块
titlemain组件可弹出内置页渲染
linenumberstrue
import React from "react";
import { DependencyContext }Dialog from "@fe-plugin/components/lib/context";
import { getComponentInfo } from "@fe-plugin/common/lib/component-infoh5/confirm-dialog";
import { withEditableComponent }withPopup from "@fe-plugin/components/lib/templatesh5/editablewith-componentpopup";
import { withEditableButtongetElementByKey } from "@fe-plugin/componentscommon/lib/templates/editablecomponent-element";
import BaseButton from "@fe-plugin/components/lib/templates/cmps/button";
import * as ELEMENT_KEY from "constants/element-keys";


// 创建一个可编辑组件可弹出内置页渲染
const EditableComponent = withEditableComponent();

function InlineRender(props) {
  // 编辑器舞台编辑组件获取main组件传入的参数
class Template extends React.Componentconst {
  //获取上下文
  static contextTypecomponentInfo, onClose, getElement } = DependencyContextprops;

  //const 渲染组件
getElement = renderCmp(type) {
    // 根据元素配置的key值创建一个可编辑元素 => getElementByKey(componentInfo, type);

  return (
    <Dialog
    const EditableButton dialog= withEditableButton{getElement(ELEMENT_KEY.Button)((element) => {POPUP_DIALOG)}
      return <BaseButton data={element} style={element.style} />;image={getElement(ELEMENT_KEY.IMAGE_B)}
    });

    return (button={getElement(ELEMENT_KEY.BTN_B)}
      <EditableComponent>onClick={onClose}
        <div>
       onClose={onClose}
   <EditableButton />
        </div>
      </EditableComponent>
    );
  }
}

export default TemplatewithPopup(InlineRender);