時(shí)間:2023-07-22 00:51:01 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-07-22 00:51:01 來源:網(wǎng)站運(yùn)營
從零搭建一款PC頁面編輯器PC-Dooring:之前一直忙著調(diào)研lowcode平臺(tái)和開發(fā)以下兩個(gè)項(xiàng)目: - H5編輯器H5-Dooring , - 可視化大屏編輯器V6.Dooringreact-dnd
, 其拖拽分為兩個(gè)部分, 一個(gè)是從組件區(qū)拖拽到畫布區(qū), 另一個(gè)是畫布區(qū)內(nèi)部組件的自由拖拽. 我們可以用原生H5的拖放API來實(shí)現(xiàn)第一部分的功能, 本質(zhì)是將拖動(dòng)源攜帶的數(shù)據(jù)傳到畫布制定區(qū)域, 目標(biāo)源監(jiān)聽事件拿到攜帶的數(shù)據(jù)動(dòng)態(tài)渲染出實(shí)際的組件. 過程如下: react-dnd
的朋友都知道, 以上兩個(gè)功能通過react-dnd
都可以實(shí)現(xiàn), 大家可以參考它的官網(wǎng)react-dnd官網(wǎng)學(xué)習(xí)研究具體實(shí)現(xiàn)流程, 也可以直接參考PC-Dooring源碼.antd
, element
, zant
等, 組件物料需要遵循我們約定的DSL協(xié)議
, 這里大家可以參考工業(yè)級(jí)協(xié)議標(biāo)準(zhǔn)odata規(guī)范. 有了一定的規(guī)范, 我們就可以包裝標(biāo)準(zhǔn)的組件物料從而集成第三方組件庫了.mobx
, redux
, dva
等來實(shí)現(xiàn), 最終目的就是讓編輯器不同部分能相互關(guān)聯(lián), 實(shí)時(shí)更新組件狀態(tài), 以及數(shù)據(jù)回傳能力. 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定義了組件的屬性約束, 可編輯項(xiàng)類型以及默認(rèn)值, 如下: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: '標(biāo)題顏色', type: 'Color', }, { key: 'fontSize', name: '字體大小', type: 'Number', }, { key: 'align', name: '對(duì)齊方式', type: 'Select', range: [ { key: 'left', text: '左對(duì)齊', }, { key: 'center', text: '居中對(duì)齊', }, { key: 'right', text: '右對(duì)齊', }, ], }, { key: 'lineHeight', name: '行高', type: 'Number', }, ], config: { text: '我是文本', color: 'rgba(60,60,60,1)', fontSize: 18, align: 'center', lineHeight: 2, },};export default Text;
template主要規(guī)定了組件在畫布中展示的基本方式, 如下:const template = { type: 'Text', h: 20, displayName: '文本組件',};export default template;
當(dāng)然大家也可以擴(kuò)展其定義或者將schema和template合并. 只要一個(gè)組件符合了以上約定, 都可以被我們編輯器所消費(fèi).覺得有用 ?喜歡就收藏,順便點(diǎn)個(gè)贊吧,你的支持是我最大的鼓勵(lì)!微信搜 “趣談前端”,發(fā)現(xiàn)更多有趣的H5游戲, webpack,node,gulp,css3,javascript,nodeJS,canvas數(shù)據(jù)可視化等前端知識(shí)和實(shí)戰(zhàn).
關(guān)鍵詞:編輯
客戶&案例
營銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。