低代码02之左侧物料拖拽到内容区
npm i deepcopy
- 功能介绍
- 1:左侧菜单拖拽功能 - useMenuDragger.js
- 2:右侧内容区域,点击获取焦点功能 - useFocus.js
- 3:右侧内容区域,内容区域点击组件聚焦后进行拖拽功能 - useBlockDragger.js
- 4:左侧菜单组件拉入内容区域时,添加辅助线 (useFocus.js与 useBlockDragger.js )
- 在useFocus.js之中,先找到最后聚焦的组件索引值,拿到这个组件
- 在useBlockDragger.js中,定义辅助线markLine数据,记录拖拽前 B组件的位置 top和left,以及辅助线lines数据(顶对顶…中对中等)、移动的时候(需要拿到最后辅助线的x和y数据)
功能1:左侧菜单拖拽功能 - src / packsges / useMenuDragger.js
- 左侧菜单的拖拽,放入内容区之中
draggable onDragstart={(e) => dragstart(e, component)} onDragend={dragend}
export function useMenuDragger (containerRef,data){
let currentComponent = null
const dragstart = (e,component)=>{
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)
currentComponent = null;
}
const dragenter = (e)=>{
e.dataTransfer.dropEffect = 'move';
}
const dragover = (e)=>{
e.preventDefault();
}
const dragleave = (e)=>{
e.dataTransfer.dropEffect = 'none';
}
const drop = (e)=>{
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
}
return {
dragstart,
dragend
}
}
功能2 内容区域聚焦与失去焦点 src / packsges / useFocus.js
- 内容区域之中的组件聚焦事件与按下shift聚焦与按下内容区域失去焦点( 含有按下组件的时候,执行拖拽的回调函数 )、获取到 聚焦的组件数据
<EditorBlock class={block.focus ? "editoe-blick-focus" : ""} block={block} onMousedown={(e) => blockMousedown(e, block)}></EditorBlock>
import {
computed ,ref } from "vue";
export function useFocus(data, callback) {
let selectIndex = ref(-1);
let lastSelectBlock = computed(()=>data.value.blocks[selectIndex.value])
const clearBlockFocus = () => {
data.value.blocks.forEach((block) => (block.focus = false));
};
const blockMousedown = (e, block,index) => {
e.preventDefault();
e.stopPropagation();
if (e.shiftKey) {
if ( focusData.value.length <= 1 ) {
block.focus = true;
} else {
block.focus = !block.focus;
}
} else {
if (!block.focus) {
clearBlockFocus();
block.focus = true;
}
}
selectIndex.value = index
callback(e);
};
const containerMousedown = () => {
clearBlockFocus();
selectIndex.value = -1
};
const focusData = computed(() => {
let focus = [];
let unfocused = [];
data.value.blocks.