首页 > 其他分享 >简单的低开编辑器(二):实现组件拖拽

简单的低开编辑器(二):实现组件拖拽

时间:2023-11-21 20:35:26浏览次数:34  
标签:blocks 低开 component value 编辑器 组件 containerRef data 拖拽

好家伙,

 

0.代码已开源

Fattiger4399/lowcode-demo: 一个简单的低代码编辑器 技术栈:Vue3 element-plus jsx (github.com)

该章实现的效果:组件从物料区到画布的拖拽

 

1.分析

 

 

先来分析,鼠标点击物料区的某个组件,再将其拖拽到画布这个过程

我们如何实现组件的拖拽??

  1. 鼠标按下组件时获取当前选中组件的信息
  2. 绑定鼠标的移动和松开事件,松开时在画布上渲染当前块。
  3. 将拖拽的组件渲染在画布上。

 

<div>
            <div class="editor-left">
                {/* 根据注册列表 渲染对应的内容 可以实现h5的拖拽*/}
                {config.componentList.map(component => (
                    <div class="editor-left-item"
                        draggable
                        onDragstart={e => dragstart(e, component)}
                        onDragend={dragend}
                    >
                        <span>{component.label}</span>
                        <div>{component.preview()}</div>

                    </div>
                ))}
            </div>

            <div class="editor-top">菜单栏</div>
            <div class="editor-right">属性控制栏目</div>
            <div class="editor-container">
                <div class="editor-container-canvas">
                    {/* 产生内容 */}
                    <div class="editor-container-canvas__content"
                        style={containerStyles.value}
                        ref={containerRef}
                        onm ousedown={containerMousedown}>
                        {
                            (data.value.blocks.map(block => (
                                <EditorBlock
                                    class={block.focus ? 'editor-block-focus' : ''}
                                    block={block}
                                    onm ousedown={(e) => blockMousedown(e, block)}
                                ></EditorBlock>
                            )))
                        }
                    </div>
                </div>
            </div>

        </div>

 

2.处理物料区   

import { registerConfig as config } from './utils/editor-config'

config为我们的组件注册表信息

    const { dragstart, dragend } = useMenuDragger(containerRef, data)

{config.componentList.map(component => ( <div class="editor-left-item" draggable onDragstart={e => dragstart(e, component)} onDragend={dragend} > <span>{component.label}</span> <div>{component.preview()}</div> </div> ))}

 

此处为物料组件添加onDragstart和onDragend事件

 

useMenuDragger.js

export function useMenuDragger(containerRef,data){
    let currentComponent = null;
        const dragenter = (e) => {
            e.dataTransfer.dropEffect = 'move'; //h5的拖动图标
        }

        const dragover = (e) => {
            e.preventDefault();
        }

        const dragleave = (e) => {
            e.dataTransfer.dropEffect = 'none';
        }

        const drop = (e) => {
            //先留在这
            console.log(e.offsetY)
            console.log(e.offsetX)

            let blocks = data.value.blocks;//内部已渲染的组件
            data.value = {
                ...data.value, blocks: [
                    ...blocks,
                    {
                        top: e.offsetY,
                        left: e.offsetX,
                        zIndex: 1,
                        key: currentComponent.key,
                        alignCenter: true //松手时剧中 
                    }
                ]
            }
            currentComponent = null
        }
        const dragstart = (e, component) => {
            //dragenter进入元素中
            containerRef.value.addEventListener('dragenter', dragenter)
            containerRef.value.addEventListener('dragover', dragover)
            containerRef.value.addEventListener('dragleave', dragleave)
            containerRef.value.addEventListener('drop', drop)
            currentComponent = component
        }
        const dragend = (e) => {
            containerRef.value.removeEventListener('dragenter', dragenter)
            containerRef.value.removeEventListener('dragover', dragover)
            containerRef.value.removeEventListener('dragleave', dragleave)
            containerRef.value.removeEventListener('drop', drop)
        }
        return{
            dragstart,
            dragend
        }
}

 

 

3.处理画布区域  

<div class="editor-container-canvas__content"
                        style={containerStyles.value}
                        ref={containerRef}
                        onm ousedown={containerMousedown}>
                        {
                            (data.value.blocks.map(block => (
                                <EditorBlock
                                    class={block.focus ? 'editor-block-focus' : ''}
                                    block={block}
                                    onm ousedown={(e) => blockMousedown(e, block)}
                                ></EditorBlock>
                            )))
                        }
                    </div>

组件传值

当组件被拉倒画布后

const drop = (e) => {
            //先留在这
            console.log(e.offsetY)
            console.log(e.offsetX)

            let blocks = data.value.blocks;//内部已渲染的组件
            data.value = {
                ...data.value, blocks: [
                    ...blocks,
                    {
                        top: e.offsetY,
                        left: e.offsetX,
                        zIndex: 1,
                        key: currentComponent.key,
                        alignCenter: true //松手时剧中 
                    }
                ]
            }
            currentComponent = null
        }

将新组件(拖拽组件)的相关值添加到data.value.blocks中,最后由渲染器进行渲染

(data.value.blocks.map(block => (
                                <EditorBlock
                                    class={block.focus ? 'editor-block-focus' : ''}
                                    block={block}
                                    onm ousedown={(e) => blockMousedown(e, block)}
                                ></EditorBlock>
                            )))

 

标签:blocks,低开,component,value,编辑器,组件,containerRef,data,拖拽
From: https://www.cnblogs.com/FatTiger4399/p/17847361.html

相关文章

  • Linux系统的Vim编辑器怎么用
    今天公司要换Linux服务器,已经两年不用命令行操作的我赶紧学习起了Linux操作,其实不难,VIM编辑器是内置在Linux系统里面的一款有效的编辑器,功能十分强大,堪称“世界上最好的编辑器”步入正题文件操作【增,删,改,查】【增】新建文件touch新增目录mkdir目录名命令:touch文件名示例:在......
  • 【HarmonyOS】低代码平台组件拖拽使用技巧之页签容器
    ​【关键字】HarmonyOS、低代码平台、Tabs、TabContent、页签导航 1、写在前面前面几篇分别介绍了低代码平台中的堆叠容器、滚动容器、网格布局等三种容器的使用,实际开发中我们经常会有这样的需求,页面底部是三个Tab按钮点击时会分别切换不同的视图内容,本篇我们就来介绍低代码......
  • 【HarmonyOS】低代码平台组件拖拽使用技巧之列表
    ​【关键字】HarmonyOS、低代码平台、组件拖拽、列表、列表项 1、写在前面我们在日常开发中使用最多的组件可能就是列表组件了,现在几乎所有的应用都离不开列表,那么今天我们就来介绍一下如何利用低代码平台来实现列表的展示,列表实际上也是容器的一种,需要注意的是,列表是需要结......
  • 【HarmonyOS】低代码平台组件拖拽使用技巧之常用基础组件(上)
    ​【关键字】HarmonyOS、低代码平台、组件拖拽、常用基础组件、基础容器 1、写在前面之前是花了一些时间介绍了在低代码平台中滚动容器、网格布局、页签容器、列表这几种容器的拖拽技巧及使用方法,今天我会继续来介绍咱们在应用开发中可能会经常用到的一些基础容器和基础组件,......
  • vue实现会议室拖拽布局排座
    会议室拖拽布局排座是vue-draggable结合vue-draggable-resizable-gorkys进行开发vue-draggable是拖拽组件,可以在组件里拖动排序,也可以多个组件之间拖动排序vue-draggable-resizable-gorkys是一更强大的拖拽组件,可以随意拖拽,有点坐标先进行会议室的布局然后对某个会议进行人......
  • 本地Stackedit Markdown编辑器设置远程访问
    StackEdit是一个受欢迎的Markdown编辑器,在GitHub上拥有20.7kStar!,它支持将Markdown笔记保存到多个仓库,包括Gitee、GitHub和Gitea。此在线笔记工具还提供了一些便捷功能,如拖拽或粘贴上传图片、文件搜索功能,以及可切换为炫酷的暗黑主题,这些功能特别适合那些喜欢使用Markdown来记录笔......
  • cocos如何绑定参数到编辑器
    很多cocos creator同学不知道如何绑定组件属性到编辑器上,今天我们来教大家如何绑定  1:基本数据属性绑定到编辑器   这个非常简单,模板是属性名字: 默认的值;Is_debug:false,speed:100,2:系统组件类型与节点绑定到编辑器属性名字: {   type:组件类型(cc......
  • 简单的低开编辑器(一):实现组件渲染
    好家伙, 项目目录如下:该项目使用Vue3,Element-plus 效果图如下:  开搞:1.写出简单界面App.vue<template><divclass="app"><Editorv-model="state"></Editor></div></template><script>import{ref,p......
  • 神辅助 Cursor 编辑器,加入 GPT-4 让编码更轻松!-未来:复制粘贴工程师转向提示工程师
    在ChatGPT问世之前,我们的编码方式很多时候都是面向搜索引擎编码,需要不断地进行搜索,然后复制粘贴,俗称复制粘贴工程师。但是,随着ChatGPT的出现,这一切将彻底改变。ChatGPT是一种基于人工智能的自然语言处理模型,可以根据上下文理解人类语言并生成相应的回复。在编码方面,ChatGPT可......
  • Geany 2.0 发布使其成为更通用的文本编辑器和 IDE
    导读Geany 被认为是 Linux 上最好的PythonIDE 之一,它是一个基于GTK3工具包的开源、轻量级IDE。考虑到Geany的功能集对各种用户的吸引力,它也可以算作 Linux上Notepad++的替代品之一。现在,新版本已以“Geany2.0”的形式推出,提供了许多改进。让我们看看......