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

輕松教你搞定組件的拖拽, 縮放, 多控制點伸縮和拖拽數(shù)據(jù)上報

大數(shù)據(jù) 數(shù)據(jù)可視化
由于我們的技術(shù)棧采用的是 React, 目前還沒有一個成熟庫可以同時支持自由拖拽和縮放, 我們不得不用 react-dragable 和 react-resiable兩個庫來實現(xiàn)拖拽和縮放, 但是這樣我們要維護的數(shù)據(jù)結(jié)構(gòu)就相當(dāng)復(fù)雜了(當(dāng)然vue生態(tài)有成熟的vue-dragable等來支持自由拖拽和縮放), 所以最后筆者決定自己來實現(xiàn)一個.

[[376393]]

 也在 H5-Dooring 項目中做了很多技術(shù)實現(xiàn), 包括:

  • 搭建平臺的組件設(shè)計和分類模式
  • 拖拽生成頁面方案
  • 動態(tài)表單編輯器設(shè)計
  • 頁面實時預(yù)覽編譯技術(shù)
  • 自定義組件和自定義模版方案
  • 多人協(xié)作的可視化搭建模式實現(xiàn)

還有很多技術(shù)細節(jié)這里不一一舉例了, 最近在研究自由布局時發(fā)現(xiàn)有這樣一個需求, 我們可以自由拖拽和縮放組件, 并能從組件的不同緯度拖拽, 如下圖所示:

圖片

由于我們的技術(shù)棧采用的是 React, 目前還沒有一個成熟庫可以同時支持自由拖拽和縮放, 我們不得不用 react-dragable 和 react-resiable兩個庫來實現(xiàn)拖拽和縮放, 但是這樣我們要維護的數(shù)據(jù)結(jié)構(gòu)就相當(dāng)復(fù)雜了(當(dāng)然vue生態(tài)有成熟的vue-dragable等來支持自由拖拽和縮放), 所以最后筆者決定自己來實現(xiàn)一個.

我們從可視化搭建平臺的實際業(yè)務(wù)出發(fā), 可以分析出拖拽縮放有如下幾個功能點:

  • 自由拖拽
  • 支持控制點, 多方位縮放
  • 支持自由控制層級
  • 支持組件靜態(tài)化(即為了實現(xiàn)固定, 預(yù)覽頁面等效果)
  • 拖拽縮放的數(shù)據(jù)能回傳給上層組件并提供受控機制

實現(xiàn)以上四點我們就可以實現(xiàn)一個可用的拖拽縮放組件. 接下來筆者就來介紹一下實現(xiàn)的開源拖拽縮放組件rc-drag.

實現(xiàn)自由拖拽

rc-drag未壓縮的體積只有20多k, 去除注釋核心代碼不到200行, 可以說是一個非常輕量的拖拽縮放組件庫了, 我們要想讓自己的組件能自由拖拽, 只需要使用如下方式:

1.安裝

  1. npm i @alex_xu/rc-drag 
  2. # 或 
  3. yarn add @alex_xu/rc-drag 

2.基本使用

  1. <div id="box" style={{position: 'relative', width: '500px', height: '260px'}}> 
  2.   <Drag container="#box" size={[200, 200]}> 
  3.     <p>Mr xu</p> 
  4.   </Drag> 
  5. </div> 

 我們只需要以上幾行代碼就能實現(xiàn)組件的自由拖拽. 效果如下:

圖片

解決可視化搭建平臺頁面層級的問題

目前在 h5-dooring 是通過橫向擴展來解決組件層級和嵌套的問題, 如果我們采用自由拖拽布局, 層級和嵌套的問題就很好解決了. 在 @alex_xu/rc-drag 這個庫中筆者實現(xiàn)設(shè)置層級的功能, 所以我們可以通過給拖拽組件設(shè)置不同的層級, 來實現(xiàn)頁面元素疊加和層的概念. 如下設(shè)置:

  1. <Drag container="#box" size={[10, 50]} zIndex={10}> 
  2.   <p>Mr xu</p> 
  3. </Drag> 

 

我們通過給組件設(shè)置更高的層級來實現(xiàn)組件堆疊的效果.

實現(xiàn)組件靜態(tài)化

我們往往會在編輯頁面時對組件進行拖拽等操作, 但是有些場景我們需要讓組件固定, 比如頭部或者頁腳, 或者鎖定某個元素, 類似于 PS 里圖層鎖定. 另一個場景是我們要實現(xiàn)公共的頁面渲染器, 在編輯狀態(tài)下可以自由拖動縮放, 但是在預(yù)覽狀態(tài)下需要讓元素固定, 不能出現(xiàn)自有拖拽等功能, 類似 h5-dooring 那種模式, 這個時候我們需要讓拖拽組件@alex_xu/rc-drag支持靜態(tài)化. 這個時候我們可以設(shè)置isStatic屬性為true, 如下圖:


代碼如下:

  1. <Drag container="#box" isStatic={true}><p>static item</p></Drag> 

 我們可以利用這個屬性, 寫個頁面渲染器, 用戶在預(yù)覽時將組件的isStatic設(shè)置為true即可, 源碼的底層實現(xiàn)其實也很簡單, 就是利用react-hoooks的組件編寫方式寫個判斷即可:

  1.    isStatic ?  
  2.       <div className="x-drag-item" style={style}>{ children }</div> 
  3.       : 
  4.       <div  
  5.         className="x-drag-item"  
  6.         style={style}  
  7.         onMouseDown={(e) => onMouseDown('move', e)}  
  8.         onMouseUp={onMouseUp} onMouseMove={onMouseMove} 
  9.       > 
  10.       </div> 

 實現(xiàn)組件數(shù)據(jù)上報

我們都知道組件單純只有拖拽縮放能力遠遠不能滿足業(yè)務(wù)需求, 對于可視化拖拽組件, 更重要的是要能保留拖拽后的數(shù)據(jù), 比如寬高,位置,層級等數(shù)據(jù), 所以我們需要監(jiān)控幾個事件, 并將數(shù)據(jù)傳給對應(yīng)的事件來讓外層能監(jiān)聽和獲取. 這里筆者提供了兩個拖拽回傳方法:

  • onDrapStart
  • onDrapStop

后面根據(jù)實際情況可以對應(yīng)添加. 我們可以在父組件中綁定對應(yīng)的方法, 如下:

  1. <Drag  
  2.   container="#box"  
  3.   size={[200, 200]}  
  4.   zIndex={2}  
  5.   onDragStart={(item) => console.log('start', item)}  
  6.   onDragStop={(item) => console.log('stop', item)} 
  7.   <p>Mr xu</p> 
  8. </Drag> 

 這樣我們就能在父層拿到對應(yīng)的數(shù)據(jù)并保存下來了, 進而也就能實現(xiàn)我們的預(yù)覽頁面的功能了. 具體可以參考H5-Dooring 渲染器的部分.

支持移動端拖拽

目前筆者已經(jīng)支持移動端使用@alex_xu/rc-drag組件了,我們?nèi)绻鲆苿佣说腍5編輯器, 可以直接使用它來實現(xiàn)拖拽功能.

圖片

以上幾個技術(shù)點和技術(shù)實現(xiàn)是可視化拖拽組件必備的要素, 大家可以使用參考一下.


 

責(zé)任編輯:姜華 來源: 趣談前端
相關(guān)推薦

2024-01-03 08:43:17

圖形編輯器旋轉(zhuǎn)控制點縮放控制點

2011-09-28 13:28:56

F5虛擬化云計算

2021-04-08 05:58:45

Excel數(shù)據(jù)技巧

2017-03-13 10:11:28

AndroidRecyclerVie功能介紹

2011-05-23 14:15:31

2017-04-05 14:00:10

拖拽式機器學(xué)習(xí)配置

2012-04-24 09:48:49

HTML5

2016-09-09 01:07:06

數(shù)據(jù)中心容量規(guī)劃數(shù)據(jù)中心

2020-12-08 10:32:15

Python郵件tcp

2017-04-18 14:17:09

機器學(xué)習(xí)算法數(shù)據(jù)

2024-01-23 09:15:33

Vue3組件拖拽組件內(nèi)容編輯

2022-07-27 09:00:26

前端拖拽排序庫

2019-07-18 10:06:56

人工智能百度EasyDL

2021-07-28 06:10:47

拖拽設(shè)計器 transmat

2024-06-06 08:27:42

2009-09-13 20:28:38

Linq插入數(shù)據(jù)

2021-12-30 16:10:52

鴻蒙HarmonyOS應(yīng)用

2023-09-06 09:00:00

2021-08-25 09:38:16

鴻蒙HarmonyOS應(yīng)用

2020-08-23 12:27:39

測試接口技巧
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产一区二区三区 | 日日干夜夜操 | 日本久久久影视 | 午夜精品一区二区三区在线播放 | 久久合久久| 日韩精品一区二区三区视频播放 | 91麻豆精品国产91久久久资源速度 | 精品国产一区二区三区日日嗨 | 日韩精品福利 | 91精品国产综合久久婷婷香蕉 | 97视频在线观看网站 | 国内毛片毛片毛片毛片 | 欧美成人免费在线视频 | 亚洲色图综合 | 国产精品久久久久久久粉嫩 | 在线视频中文字幕 | 久久久久久国产精品 | 国产成人精品免高潮在线观看 | 在线播放国产一区二区三区 | 欧美激情在线精品一区二区三区 | 日韩欧美在线观看视频 | se婷婷| 高清亚洲 | 中文字幕在线人 | 精品一区二区三区四区 | 一区二区三区日 | 亚洲国产精品久久久久婷婷老年 | 国产精品 欧美精品 | 国产免费一区二区三区免费视频 | 91久久北条麻妃一区二区三区 | 日韩在线一区二区 | 国产精品一区一区 | 久久精品一区 | 在线成人免费视频 | 国产精品精品久久久 | 成年网站在线观看 | 日韩一级精品视频在线观看 | 国产目拍亚洲精品99久久精品 | 天天看天天摸天天操 | 久久精品99 | 亚洲精品9999 |