成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用第三方拖拽庫快速擼一個可視化搭建平臺

大數據 數據可視化
全選和組合實現的思路其實本質上是對數組的操作. 全選的過程中, 我們需要先捕獲全選的區域坐標, 然后過濾出這個區域內的組件, 然后批量更新數組中每個選中元素的選中狀態。

之前一直在研究可視化和零代碼搭建相關產品和技術, 最近逛 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(['文本', '圖片', '音頻', '視頻'])

然后再設置拖拽到畫布的事件行為:

<div class="menu">
  <div
    v-for="item in typeList"
    @click="push(item)"
    :draggable="true"
    @dragstart="addType = item"
  >
    {{ item }}
  </div>
</div>

相關事件:

// 添加
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 可視化拖拽

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2023-07-26 08:21:33

2022-01-14 07:56:38

流布局設計拖拽

2021-01-09 09:48:10

可視化自然流布局 LowCode

2019-07-30 11:35:54

AndroidRetrofit

2015-11-05 16:44:37

第三方登陸android源碼

2021-11-19 08:30:39

H5-Dooring 可視化組件商店

2021-07-27 08:29:33

可視化組件商店H5-Dooring

2013-04-07 15:13:21

CocoaPods第三方庫管理利器

2013-12-10 16:41:36

移動信息化

2013-01-15 13:50:22

iOS開發開源庫

2021-02-28 07:42:40

可視化網格線H5-Dooring

2014-07-22 10:56:45

Android Stu第三方類庫

2011-07-03 18:59:27

流量

2014-07-23 08:55:42

iOSFMDB

2021-06-16 07:05:03

安全

2024-03-22 08:21:48

可視化搭建平臺組件商店H5-Dooring

2021-06-16 08:30:36

Dooring可視化數據源設計剖析

2017-11-01 06:40:33

2023-03-16 20:46:40

可視化平臺迭代

2022-01-14 09:57:14

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩在线观看视频网站 | 亚洲精品一区二三区不卡 | 中文字幕亚洲视频 | 日本高清中文字幕 | 四虎av电影| 黄视频国产 | 日本中文字幕一区 | 亚洲+变态+欧美+另类+精品 | 久久久久久久久99 | 麻豆视频在线免费观看 | 国产91在线精品 | 日韩电影中文字幕在线观看 | 蜜桃视频在线观看免费视频网站www | 麻豆视频国产在线观看 | 九久久 | 91免费电影 | 日韩电影一区 | 国产精品色av | 青青草一区 | 天天综合网天天综合色 | 人成精品 | 91传媒在线观看 | 极品的亚洲 | 日韩有码一区 | 精品国产成人 | 久久尤物免费一区二区三区 | 久久久精彩视频 | 久久久蜜桃 | 欧美在线视频网站 | 国产午夜三级一区二区三 | 国产精品高潮呻吟久久av野狼 | 日韩国产免费观看 | 久久在线视频 | 欧美久久免费观看 | 亚洲国产精品成人综合久久久 | 成人免费视屏 | 天天拍夜夜爽 | 亚洲 成人 在线 | 国内精品视频免费观看 | 99精品国产一区二区三区 | 亚洲精品二区 |