时间:2023-07-22 00:51:01 | 来源:网站运营
时间:2023-07-22 00:51:01 来源:网站运营
从零搭建一款PC页面编辑器PC-Dooring:之前一直忙着调研lowcode平台和开发以下两个项目: - H5编辑器H5-Dooring , - 可视化大屏编辑器V6.Dooringreact-dnd
, 其拖拽分为两个部分, 一个是从组件区拖拽到画布区, 另一个是画布区内部组件的自由拖拽. 我们可以用原生H5的拖放API来实现第一部分的功能, 本质是将拖动源携带的数据传到画布制定区域, 目标源监听事件拿到携带的数据动态渲染出实际的组件. 过程如下: react-dnd
的朋友都知道, 以上两个功能通过react-dnd
都可以实现, 大家可以参考它的官网react-dnd官网学习研究具体实现流程, 也可以直接参考PC-Dooring源码.antd
, element
, zant
等, 组件物料需要遵循我们约定的DSL协议
, 这里大家可以参考工业级协议标准odata规范. 有了一定的规范, 我们就可以包装标准的组件物料从而集成第三方组件库了.mobx
, redux
, dva
等来实现, 最终目的就是让编辑器不同部分能相互关联, 实时更新组件状态, 以及数据回传能力. import React, { memo } from 'react';import { ITextConfig } from './schema';import logo from '@/assets/text.png';const Text = memo((props: ITextConfig & { isTpl: boolean }) => { const { align, text, fontSize, color, lineHeight, isTpl } = props; return ( <> {isTpl ? ( <div> <img src={logo} alt=""></img> </div> ) : ( <div style={{ color, textAlign: align, fontSize, lineHeight }}>{text}</div> )} </> );});export default Text;
schema定义了组件的属性约束, 可编辑项类型以及默认值, 如下:import { IColorConfigType, INumberConfigType, ISelectConfigType, ITextConfigType, TColorDefaultType, TNumberDefaultType, TSelectDefaultType, TTextDefaultType,} from '@/components/FormComponents/types';export type TTextSelectKeyType = 'left' | 'right' | 'center';export type TTextEditData = Array< ITextConfigType | IColorConfigType | INumberConfigType | ISelectConfigType<TTextSelectKeyType>>;export interface ITextConfig { text: TTextDefaultType; color: TColorDefaultType; fontSize: TNumberDefaultType; align: TSelectDefaultType<TTextSelectKeyType>; lineHeight: TNumberDefaultType;}export interface ITextSchema { editData: TTextEditData; config: ITextConfig;}const Text: ITextSchema = { editData: [ { key: 'text', name: '文字', type: 'Text', }, { key: 'color', name: '标题颜色', type: 'Color', }, { key: 'fontSize', name: '字体大小', type: 'Number', }, { key: 'align', name: '对齐方式', type: 'Select', range: [ { key: 'left', text: '左对齐', }, { key: 'center', text: '居中对齐', }, { key: 'right', text: '右对齐', }, ], }, { key: 'lineHeight', name: '行高', type: 'Number', }, ], config: { text: '我是文本', color: 'rgba(60,60,60,1)', fontSize: 18, align: 'center', lineHeight: 2, },};export default Text;
template主要规定了组件在画布中展示的基本方式, 如下:const template = { type: 'Text', h: 20, displayName: '文本组件',};export default template;
当然大家也可以扩展其定义或者将schema和template合并. 只要一个组件符合了以上约定, 都可以被我们编辑器所消费.觉得有用 ?喜欢就收藏,顺便点个赞吧,你的支持是我最大的鼓励!微信搜 “趣谈前端”,发现更多有趣的H5游戏, webpack,node,gulp,css3,javascript,nodeJS,canvas数据可视化等前端知识和实战.
关键词:编辑