Squash merge branch 'feature/oc_actionbox_879360293' into 'master' 对魔方编辑器核心代码stage进行重构,这部分代码主要是负责编辑器中间画布区域的处理,包括渲染一个所见即所得的画布,支持组件的增删改查和拖拽、高亮操作。 旧代码存在的问题以及解决方案: 1、过多暴露属性和循环引用,导致stageCore、stageDragResize、StageMultiDragResize、StageRender、StageMask、StageHighlight之间形成复杂的网状依赖,非常不可控。StageCore负责创建后面5个类的实例,并把这些实例作为自己的公共属性,同时core把自己的this传给这些实例,这些实例就会通过core传进来的this,通过core间接的访问其它实例的方法和属性,比如在stageDragResize中可能存在这样的一个访问:this.core.stageRender.contentWindow.document 解决方案: 1)、属性尽量设置为私有,对外暴露方法,不暴露属性; 2)、core避免向其它类传递this,改为传递接口,需要什么就传什么 2、事件传递较多,跳来跳去,定位问题较为困难 解决方案: 重新梳理各个类的职责,尽量在类中闭环,减少事件传递。 新增了actionManager类,core负责管理render、mask、actionManager三个类; actionManager负责管理单选、多选、高亮三个类,同时将mask中的事件监听,转移到actionManager监听,actionManager形成单选、多选、高亮行为后,直接调动单选、多选、高亮完成功能。 3、存在一些重复代码 主要是拖拽框的代码在单选、多选、高亮中各自维护,改为统一维护 4、多选不支持辅助线对齐 将单选中的moveableOption管理逻辑抽取出来成为单选和多选的父类,使多选支持辅助线对齐 本次改动取消了一些对外暴露的属性,moveableOption回调函数签名也有变化,详细情况如下: 删除stageCore公共属性: public selectedDom: HTMLElement | undefined; public selectedDomList: HTMLElement[] = []; public highlightedDom: Element | undefined; public dr: StageDragResize; public multiDr: StageMultiDragResize; public highlightLayer: StageHighlight; public config: StageCoreConfig; public zoom = DEFAULT_ZOOM; public containerHighlightClassName: string; public containerHighlightDuration: number; public containerHighlightType?: ContainerHighlightType; public isContainer: IsContainer; stageCore入参改动: 这两个参数原本定义: moveableOptions?: ((core?: StageCore) => MoveableOptions) | MoveableOptions; multiMoveableOptions?: ((core?: StageCore) => MoveableOptions) | MoveableOptions; 修改后定义: moveableOptions?: CustomizeMoveableOptions; multiMoveableOptions?: CustomizeMoveableOptions; CustomizeMoveableOptions = | ((config?: CustomizeMoveableOptionsCallbackConfig) => MoveableOptions) | MoveableOptions | undefined; export interface CustomizeMoveableOptionsCallbackConfig { targetElId?: string; }
7.0 KiB
m-editor
props
modelValue
-
类型: MApp[]
-
默认值: {}
-
详情:
页面初始值
-
示例:
{
type: 'app',
id: 'app_1',
items: [
{
type: 'page',
id: 'page_1',
items: [
{
type: 'text',
id: 'text_1',
text: '文本'
}
]
}
]
}
componentGroupList
-
类型: ComponentGroup[]
-
默认值: []
-
详情:
左侧面板中的组件列表
-
示例:
import { FolderOpened, SwitchButton, Tickets } from '@element-plus/icons-vue';
[
{
title: '容器',
items: [
{
icon: FolderOpened,
text: '组',
type: 'container',
},
],
},
{
title: '基础组件',
items: [
{
icon: Tickets,
text: '文本',
type: 'text',
},
{
icon: SwitchButton,
text: '按钮',
type: 'button',
},
],
},
]
::: tip icon使用的是element-plus icon
也可直接使用url,例如
{
icon: 'https://vfiles.gtimg.cn/vupload/20220614/9cc3091655207317835.png'
}
:::
::: warning 此配置仅在sidebar中配置了'component-list'时有效 :::
sidebar
-
类型: SideBarData
-
默认值: { type: 'tabs', status: '组件', items: ['component-list', 'layer'] }
-
详情:
左侧面板,目前只支持type: 'tabs';
component-list的text为'组件'
-
示例:
import { List } from '@element-plus/icons-vue';
import ModListPanel from '../components/sidebars/ModListPanel.vue';
{
type: 'tabs',
status: '组件',
items: [
'component-list',
'layer',
{
type: 'component',
icon: List,
component: ModListPanel,
text: '模块',
},
}
::: tip icon使用的是element-plus icon
也可直接使用url,例如
{
icon: 'https://vfiles.gtimg.cn/vupload/20220614/9cc3091655207317835.png'
}
:::
menu
-
类型: MenuBarData
-
默认值: { left: [], center: [], right: [] }
-
详情:
顶部工具栏
系统提供了几个常用功能: '/' | 'delete' | 'undo' | 'redo' | 'zoom-in' | 'zoom-out' | 'zoom'
'/': 分隔符
'delete': 删除按钮
'undo': 撤销按钮
'redo': 恢复按钮
'zoom-in': 放大按钮
'zoom-out': 缩小按钮
'zoom': 缩放
-
示例:
import { toRaw } from 'vue';
import { ArrowLeft, Coin } from '@element-plus/icons-vue';
{
left: [
{
type: 'button',
icon: ArrowLeft,
tooltip: '返回',
},
'/',
{
type: 'text',
text: '.temp',
},
],
center: ['delete', 'undo', 'redo', 'zoom'],
right: [
{
type: 'button',
text: '保存',
icon: Coin,
disabled: true,
handler: ({ editorService }) => console.log(toRaw(editorService.get('root'))),
},
],
}
::: tip icon使用的是element-plus icon
也可直接使用url,例如
{
icon: 'https://vfiles.gtimg.cn/vupload/20220614/9cc3091655207317835.png'
}
:::
render
-
类型: Function
-
默认值: undefined
-
详情:
中间工作区域中画布渲染的内容,通常是通过解析modelValue来渲染出DOM,return的DOM结构需要有一个根节点。
-
示例:
(renderer) => renderer.contentWindow.document.createElement('div')
runtimeUrl
-
类型: string
-
默认值: undefined
-
详情:
runtime 的HTML地址,可以是一个HTTP地址,如果和编辑器不同域,需要设置跨域,也可以是一个相对或绝对路径
propsConfigs
-
类型: { [type: string]: FormConfig }
-
默认值: {}
-
详情:
组件的属性配置表单的dsl
-
示例:
{
text: [
{
name: 'text',
text: '文本',
},
{
name: 'multiple',
text: '多行文本',
type: 'switch',
},
],
button: [
{
name: 'text',
text: '文本',
},
]
}
propsValues
-
类型: { [type: string]: Object }
-
默认值: {}
-
详情:
添加组件时的默认值
-
示例:
{
text: {
text: '文本',
multiple: true,
},
button: {
text: '按钮',
},
}
moveableOptions
-
类型: ((config?: CustomizeMoveableOptionsCallbackConfig) => MoveableOptions) | MoveableOptions
-
默认值: {}
-
详情:
画布中的选中框配置选项,使用的是moveable第三方库
stageRect
-
类型: { width: number; height: number }
-
默认值: { width: 375, height: 817 }
-
详情:
画布的大小配置
autoScrollIntoView
-
类型: boolean
-
默认值: undefined
-
详情:
选中组件时,是否自动滚动该组件到可视区域
updateDragEl
-
类型: (el: HTMLDivElement, target: HTMLElement) => void;
-
默认值: undefined
-
详情:
当选中框与组件不贴合时,可以通过此方法进行调整
isContainer
-
类型: (el: HTMLDivElement) => boolean | Promise<boolean>;
-
默认值: (el: HTMLElement) => el.classList.contains('magic-ui-container')
-
详情:
当组件拖动过程中停留在画布上超过 containerHighlightDuration 时长时,识别当前是否有容器
containerHighlightDuration
-
类型: number;
-
默认值: 800(单位为ms)
-
详情:
当组件拖动过程中停留在画布上超过 containerHighlightDuration 时长时,识别当前是否有容器
containerHighlightClassName
-
类型: string;
-
默认值: 'tmagic-stage-container-highlight'
-
详情:
识别到容器后,会给其dom上添加的class
containerHighlightType
-
类型: 'default' | 'alt' | '';
-
默认值: 'default'
-
详情:
启动方式
default: 停留在画布上启动识别
alt: 按住alt键启动识别
其他值:不启动
slots
nav
- 详情: 工具栏
sidebar
- 详情: 左侧栏
workspace
- 详情: 中间工作区域
workspace-content
- 详情: 中间工作区域内部
:::tip 在没有 workspace slots 的时候才可以用 :::
propsPanel
- 详情: 属性面板