简单的低开编辑器(三):实现组件画布内拖拽

好家伙,

0.代码已开源

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

 

本篇实现效果如下:

简单的低开编辑器(三):实现组件画布内拖拽

 

1.分析

这玩意的思路很好理解

本质上就是给组件绑个拖拽方法

拽到哪里,就把位置更新给组件就好了,简单粗暴

当然,需要做选中判定,知道我选中了哪些组件

 

 

2.选中判定实现

//editor.jsx

import { useFocus } from "./useFocus";  let { blockMousedown, focusData } = useFocus(data, (e) => {             mousedown(e)         });

 

 

 

//useFocus.js

import {computed} from 'vue'  //useFocus用于处理画布中组件元素的选中 export function useFocus(data,callback){ //获取哪些元素被选中了     const focusData = computed(() => {         let focus = [];         let unfocused = [];         data.value.blocks.forEach(block => (block.focus ? focus : unfocused).push(block))         return {focus,unfocused}     })     return{         blockMousedown,         focusData     } }

此处,我们做一次选中判定,将选中的组件,和未被选中的组件,分开放,并返回

 

 

//useFocus.js

const blockMousedown = (e, block) => {         //block上我们规划一个属性focus 获取焦点后就将focus变为true         e.preventDefault();         e.stopPropagation();         if (e.shiftKey) {             block.focus = !block.focus         } else {             if (!block.focus) {                 clearBlockFocus();                 block.focus = true;//清空其他组件的focus属性             } else {                 block.focus = false;             }         }         callback(e)     }

判断是否按下了shift键

 

 

3.点击触发事件

//editor.jsx

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

let { blockMousedown, focusData } = useFocus(data, (e) => {             mousedown(e)         });         const mousemove = (e) => {             let { clientX: moveX, clientY: moveY } = e;             let endX = moveX - dragState.startX;             let endY = moveY - dragState.startY;              focusData.value.focus.forEach((block, idx) => {                 // console.log(dragState)                 block.top = dragState.startPos[idx].top + endY;                 block.left = dragState.startPos[idx].top + endX;             })         }         const mouseup = (e) => {             console.log(document)             document.removeEventListener('mousemove', mousemove)             document.removeEventListener('mouseup', mouseup)         }         const mousedown = (e) => {             dragState = {                 startX: e.clientX,                 startY: e.clientY,                 startPos: focusData.value.focus.map(({ top, left }) => ({ top, left }))             }             console.log(dragState)             document.addEventListener('mousemove', mousemove)             document.addEventListener('mouseup', mouseup)         }

 

//useFocus.js

const blockMousedown = (e, block) => {         //block上我们规划一个属性focus 获取焦点后就将focus变为true         e.preventDefault();         e.stopPropagation();         if (e.shiftKey) {             block.focus = !block.focus         } else {             if (!block.focus) {                 clearBlockFocus();                 block.focus = true;//清空其他组件的focus属性             } else {                 block.focus = false;             }         }         callback(e)     }

判断是否按下了shift键

 

focusData.value.focus.forEach((block, idx) => {                 // console.log(dragState)                       block.top = dragState.startPos[idx].top + endY;                 block.left = dragState.startPos[idx].top + endX;             })

最后更改数据

搞定!

 

 

发表评论

评论已关闭。

相关文章