服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - 用第三方拖拽库快速撸一个可视化搭建平台

用第三方拖拽库快速撸一个可视化搭建平台

2023-12-06 14:09趣谈前端 编程技术

之前一直在研究可视化和零代码搭建相关产品和技术, 最近逛 github 的时候发现一个比较有意思的拖拽开源组件, 就用 vue3 简单撸了一个拖拽搭建的小demo, 供大家参考学习.

之前一直在研究可视化和零代码搭建相关产品和技术, 最近逛 github 的时候发现一个比较有意思的拖拽开源组件, 就用 vue3 简单撸了一个拖拽搭建的小demo, 供大家参考学习.

用第三方拖拽库快速撸一个可视化搭建平台

可视化拖拽demo项目介绍

空闲时间简单设计了几个功能, 如下:

  • 支持设置拖拽单位(阈值)
  • 支持撤销重做
  • 支持导入和导出 json
  • 支持组件全选 / 组合
  • 技提供了常用的四个基础组件(文本, 图片, 音频, 视频)

因为之前我的技术栈主要是react, 为了让更多小伙伴低成本的上手, 这里项目采用大家比较熟悉的vue3 + vite.

项目采用的拖拽开源库 es-drager, 当然为了更好的显示代码, 也使用了 monaco-editor,  如下是它的代码展示效果:

用第三方拖拽库快速撸一个可视化搭建平台图片

整体来说展示效果还是不错的, 为开源作者们点赞.

完整项目仓库地址: https://github.com/MrXujiang/vue3-drag-demo

线上演示地址: drag_demo 可视化拖拽

一些技术实现的介绍

上面的demo主要实现思路拆解如下:

  • 实现组件从左侧面板拖拽到画布
  • 组件在画布中的移动, 操作(全选, 拉伸, 旋转, 参考线等)
  • 组件属性的配置
  • 可视化的相关操作(导入, 导出, 撤销, 重做等)

1.实现组件从左侧面板拖拽到画布

这里实现也很简单, 我们采用H5的原生api: drag & drop 来实现. 也就是说从左侧面板拖拽到画布, 本质上是数据的移动.

用第三方拖拽库快速撸一个可视化搭建平台图片

我们先定义好左侧面板的组件类型:

const typeList = reactive(['文本', '图片', '音频', '视频'])

然后再设置拖拽到画布的事件行为:

相关事件:

// 添加
function push(type: string) {
  isupd.value = true;
  switch (type) {
    case '文本':
      data.value.push({
        id: uuid(),
        type: 'text',
        value: '输入文本',
        width: 200,
        height: 50,
        angle: 0,
        ...addDistance.value
      })
      reset()
      break;
    case '图片':
      data.value.push({
        id: uuid(),
        type: 'image',
        value: 'https://turntip.cn/uploads/sucai/11_189dd429f23.webp',
        width: 100,
        height: 100,
        angle: 0,
        ...addDistance.value
      })
      reset()
      break;
    case '音频':
      data.value.push({
        id: uuid(),
        type: 'audio',
        value: 'https://turntip.cn/uploads/sucai/Just Relax_189bfc7d990.mp3',
        width: 300,
        height: 50,
        angle: 0,
        ...addDistance.value
      })
      reset()
      break;
      // ...
  }
}

最后在画布上监听拖放事件, 获取“传递的数据”.

// 拖进画布的回调
function drop(e: any) {
  addDistance.value = {
    top: e.layerY,
    left: e.layerX
  }
  push(addType.value);
}

通过这样的操作, 我们就可以将组件从左侧轻松拖拽到画布的指定位置了.

当然实际的低代码设计往往比现在设计的复杂很多, 这里主要是为了方便大家快速理解.

2. 支持组件全选 / 组合

全选和组合实现的思路其实本质上是对数组的操作. 全选的过程中, 我们需要先捕获全选的区域坐标, 然后过滤出这个区域内的组件, 然后批量更新数组中每个选中元素的选中状态:

用第三方拖拽库快速撸一个可视化搭建平台图片

这里分享一下实现元素组合的逻辑:

// 组合
function handleMakeGroup() {
  const selected = data.value.filter(item => item.selected && item.type != 'combination');
  if (selected.length > 1) {
    let value: any[] = JSON.parse(JSON.stringify(selected));
    const Unchecked = data.value.filter(item => !item.selected);
    const top = selected.sort((x, y) => x.top - y.top)[0].top;
    const left = selected.sort((x, y) => x.left - y.left)[0].left;
    const widthArr:number[]=[];
    const heightArr:number[]=[]
    selected.forEach(v=>{
      widthArr.push(v.left+v.width-left);
      heightArr.push(v.top+v.height-top)
    })
    const width=widthArr.sort((x,y)=>y-x)[0];
    const height=heightArr.sort((x,y)=>y-x)[0];
    value = value.map(v => ({
      ...v,
      top: v.top - top,
      left: v.left - left
    }))
    const obj = {
      id: uuid(),
      top,
      left,
      width,
      height,
      selected: true,
      value,
      type: 'combination',
      angle: 0
    }
    data.value = [...Unchecked, obj]
  }
}

具体实现代码大家可以参考我创建的 github 仓库.

至于其他几个功能比如撤销重做, 导入导出, 都是很基本的操作, 网上也有很多分享, 这里直接上代码:

// 纯前端导入并读取文件
function insert({ file, index }: any) {
  // 创建 FileReader 对象
  const reader = new FileReader();
  reader.onloadend = function () {
    data.value[index].value = reader.result;
  };
  // 读取文件并触发 onloadend 事件
  reader.readAsDataURL(file);
}

// 导出文件
function download() {
  const content = editorRef.value.save();
  const jsonData = JSON.stringify(content);
  const downloadLink = document.createElement('a');
  downloadLink.setAttribute('href', 'data:text/json;charset=utf-8,' + encodeURIComponent(jsonData));
  downloadLink.setAttribute('download', 'data.json');
  downloadLink.click();
  visible.value = !visible.value;
}

当然项目还有很多不足和需要完善的地方, 欢迎大家一起共建.

用第三方拖拽库快速撸一个可视化搭建平台图片

完整项目仓库地址: https://github.com/MrXujiang/vue3-drag-demo

线上演示地址: drag_demo 可视化拖拽

原文地址:https://mp.weixin.qq.com/s/BArQdlOijw-bnnFZiI8ZSw

延伸 · 阅读

精彩推荐
  • 编程技术URL编码表一览(推荐收藏)

    URL编码表一览(推荐收藏)

    有时候我们会碰到一些网页地址里面有一些%(百分号)组成的网址,其实这样的%与数字的组合就是一个符号。下面是URL编码表,大家可以对应下。...

    编程技术网4942020-07-18
  • 编程技术DevOps知识框架体系和实践案例整理

    DevOps知识框架体系和实践案例整理

    对于DevOps研发运维一体化,我在前面也写过了不少文章,包括了基础知识,敏捷研发,持续集成和交付,流水线设计,DevOps和容器云的集成,开源工具集,...

    今日头条4002021-01-25
  • 编程技术DevOps-需求管理工具-Jira安装部署

    DevOps-需求管理工具-Jira安装部署

    Server 和 Data Center 产品的重大变更 我们将对 Server 和 Data Center 产品执行一系列变更,包括在 2021 年 2 月 2 日停止销售新 Server 许可证,并在 2024 年 2 月 2 日...

    DevOps云学堂14492021-02-04
  • 编程技术汇编语言无效指令错误概述

    汇编语言无效指令错误概述

    此错误仅适用于奔腾 处理器、奔腾处理器与MMX技术、奔腾OverDrive处理器 和奔腾OverDrive处理器带有MMX技术。 奔腾Pro处理器, 奔腾II处理器和i486及更早版本处...

    编程技术网9582022-08-28
  • 编程技术你需要掌握的 Koa 洋葱模型和中间件

    你需要掌握的 Koa 洋葱模型和中间件

    洋葱模型,就是将数据顺序传入到多个中间件中,让它们进行处理传递,并利用函数递归的特性,让我们可以在一个中间件内先执行前半部分逻辑,再执行...

    前端西瓜哥5772022-10-25
  • 编程技术浅议NetMQ常见模式和消息加密机制

    浅议NetMQ常见模式和消息加密机制

    在传统企业级开发中,消息队列机制已经成为一种非常常见的技术实现手段,而基于NetMQ则看起来有点像一朵“奇葩”,看起来从名字似乎是一个消息队列...

    DotNET技术圈11912021-11-03
  • 编程技术基于组件开发的六大优势

    基于组件开发的六大优势

    基于组件的架构可以帮助您交付优化的应用程序来响应不断变化的市场需求。最好的部分是你不需要聘请昂贵的应用专家来做这件事!...

    今日头条4642022-10-12
  • 编程技术快来看看这是你心目中比较好的5种编程语言吗?

    快来看看这是你心目中比较好的5种编程语言吗?

    无论您是想成为Web设计人员,游戏开发人员,机器学习爱好者,还是任何其他相关技术领域,都需要一件最常见,最重要的事情。是的,您猜对了-编程语言...

    今日头条4222020-12-26