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

可視化搭建平臺的地圖組件和日歷組件方案選型

開發(fā) 前端
可視化搭建平臺除了需要為用戶提供簡單便捷的操作方式之外, 還需要提供豐富的組件支持和組件擴展, 這樣才能滿足更多用戶的業(yè)務需求.

[[360742]]

可視化搭建平臺除了需要為用戶提供簡單便捷的操作方式之外, 還需要提供豐富的組件支持和組件擴展, 這樣才能滿足更多用戶的業(yè)務需求.

在 H5-dooring 創(chuàng)建的初期主要考慮的方向是用戶使用的便捷性, 即最大程度的降低用戶操作成本, 所以采用了智能布局, 也就是react-grid-layout這個庫, 之前考慮過完全的自由布局, 也實現了一套自由布局的方案(使用react-draggable和React-Resizable), 但是崇尚 less is more 的設計哲學, 還是堅定的走了智能布局的道路.

筆者接下來會介紹如何在 H5頁面編輯器 中自定義開發(fā)自己的組件, 以及如何開發(fā)可以使H5展現力更強的組件: 地圖和日歷組件.

如果大家對可視化拖拽搭建平臺的實現方案感興趣, 可以參考我之前的文章和 github. 后續(xù)會更新更多l(xiāng)owcode和nocode的技術實現和國內外方案分析.

演示效果


實現自定義組件開發(fā)的流程

作為前端工程師, 我們對于開發(fā)vue組件或者react組件想必不會很陌生, 對于一個可擴展復用當然組件來說, 我們只需要做好以下幾點就好了:

  • 語義化 : 組件命名可讀性強, 比如antd, element的組件風格
  • 重用-發(fā)布等價原則(REP): 組件中的類要么都是可重用的,要么都不可重用
  • 共同重用原則(CRP): 組件中所有類應該是共同重用的,如果重用了組件中的一個類就應該重用組件中的所有類
  • 共同封閉原則(CCP): 組件的所有類對同一性質的變化是共同封閉的, 同時不會影響到外部, 即對修改是封閉的,但對擴展應該是開放的
  • 穩(wěn)定抽象原則(SAP): 組件的抽象程度應該與其穩(wěn)定程度保持一致

基本上任何組件的設計都會或多或少的遵循以上原則, 所以說我們在實現自定義組件時, 往往也需要考慮內外部的抽象.

我們定義Dooring的自定義組件時, 會分為以下幾個步驟:


組件的shape主要是組件對外暴露的屬性和方法, 可以實現用戶層面的配置, 也就是vue/react組件的props, 由于項目使用typescript編寫, 所以我們需要定義對應的ts類型, 來實現組件的健壯性和可溯源. 最后我們會定義組件初始化的樣子(init shape), 然后才是實現組件, 這樣的步驟好處是我們可以明確組件的邊界, 自然貼合上面筆者說的組件設計原則.

以上流程我們會產生如下三個文件:

  • componet 組件的實現代碼
  • schema 組件的shape和type
  • template 組件的類型映射模版

開發(fā)一個日歷組件

我們接下來就來實現拖拽平臺的日歷組件. 日歷組件我們直接采用zarm的Calendar組件, 將其封裝成dooring的受控組件.

日歷組件我們可以暴露如下props給到用戶自行配置:

  • time 日歷顯示的時間
  • range 日歷被選中的時間范圍, 主要用來做日程管理
  • color 日歷默認的文本顏色
  • selectedColor 選中區(qū)域的顏色
  • round 日歷的圓角

對應的view如下:


由于組件的實現只需要處理傳過來的數據, 這里我們看看簡單的代碼實現:

  1. import React, { useState, memo, useEffect, useRef } from 'react'
  2. import { Calendar } from 'zarm'
  3. import styles from './index.less'
  4. import { ICalendarConfig } from './schema'
  5.  
  6. const CalendarCp = memo((props: ICalendarConfig & { isTpl: boolean }) => { 
  7.   const { time, range, color, selectedColor, round, isTpl } = props; 
  8.   // ... 
  9.   return ( 
  10.     <div className={styles.calenderWrap} style={{borderRadius: round + 'px', pointerEvents: isEditorPage ? 'none' : 'initial'}} ref={boxRef}> 
  11.       <Calendar 
  12.         multiple={!!range} 
  13.         value={value} 
  14.         min={min
  15.         max={new Date(max)} 
  16.         disabledDate={(date:any) => /(0|6)/.test(date.getDay())} 
  17.         onChange={(value:Date[] | undefined) => { 
  18.           setValue(value); 
  19.         }} 
  20.       /> 
  21.     </div> 
  22. }); 
  23.  
  24. export default CalendarCp; 

 這是一個dooring組件的基本雛形, 其次我們看看 schema 部分. 這一部分主要包含了組件的shape的類型定義和基本的可編輯屬性(editable), 如下:

  1. export type TCalendarEditData = Array<INumberConfigType | ITextConfigType | IColorConfigType>; 
  2. export interface ICalendarConfig { 
  3.   time: TTextDefaultType; 
  4.   range: TTextDefaultType; 
  5.   color: TTextDefaultType; 
  6.   selectedColor: TTextDefaultType; 
  7.   round: TNumberDefaultType; 
  8.  
  9. export interface ICalendarSchema { 
  10.   editData: TCalendarEditData; 
  11.   config: ICalendarConfig; 
  12.  
  13. const Calendar: ICalendarSchema = { 
  14.   editData: [ 
  15.     { 
  16.       key'time'
  17.       name'日歷時間'
  18.       type: 'Text'
  19.       placeholder: '格式如2020-01或2020-11' 
  20.     }, 
  21.     { 
  22.       key'range'
  23.       name'日歷選中范圍'
  24.       type: 'Text'
  25.       placeholder: '格式如01-12(幾號到幾號)' 
  26.     }, 
  27.     { 
  28.       key'color'
  29.       name'文本顏色'
  30.       type: 'Color' 
  31.     }, 
  32.     { 
  33.       key'selectedColor'
  34.       name'選中顏色'
  35.       type: 'Color' 
  36.     }, 
  37.     { 
  38.       key'round'
  39.       name'圓角'
  40.       type: 'Number' 
  41.     }, 
  42.   ], 
  43.   config: { 
  44.     time'2020-12'
  45.     range: '05-08'
  46.     color: 'rgba(0,0,0,1)'
  47.     selectedColor: 'rgba(22,40,212,1)'
  48.     round: 0 
  49.   }, 
  50. }; 
  51.  
  52. export default Calendar; 

如果我們想增加屬性, 我們只需要在這個文件里添加對應的屬性和類型即可.

template主要是定義了組件的分區(qū)和初始高度, 代碼如下:

  1. const template = { 
  2.   type: 'Calendar'
  3.   h: 185, 
  4.   displayName: '日歷組件'
  5. }; 
  6. export default template; 

有了以上三個部分, 我們要可以渲染出一個在畫布中可拖拽, 可編輯的組件了. 當然這塊還需要FormRender的幫助, 這塊筆者后期會介紹.

以上基本就實現了一個可拖拽可配置的日歷組件, 我們接下來繼續(xù)看看地圖組件.

開發(fā)地圖組件

有了以上的組件開發(fā)經驗之后我們開發(fā)地圖組件就非常方便了. 地圖組件我們這里使用了@uiw/react-baidu-map, 也就是百度地圖的React版本, 大家也可以使用高德地圖.因為地圖組件react-baidu-map 需要提前閱讀對應的文檔, 這里筆者就不一一介紹了, 我們直接來看如何實現.同樣我們也需要定義好地圖對外暴露的props, 筆者這里簡單定義幾個可配置的屬性:

  • ak 百度地圖使用憑證, 建議大家在生產環(huán)境替換成自己的
  • location 地點的經緯度, 方便快速定位
  • position 地點的地名, 我們可以自定義設置

如下圖:


基本的代碼實現如下:

  1. import React, { memo } from 'react'
  2. import { Map, Marker, Label, APILoader } from '@uiw/react-baidu-map'
  3. import styles from './index.less'
  4. import { IMapConfig } from './schema'
  5.  
  6. const Mapcomponent = memo((props: IMapConfig) => { 
  7.   const { ak, location, position } = props; 
  8.   return ( 
  9.         <div className={styles.mapWrap}> 
  10.           <APILoader akay={ak}> 
  11.             <Map widget={['NavigationControl']} zoom={13}> 
  12.               <Marker animation={2} position={{ lng: position[0], lat: position[1] }} /> 
  13.               <Label  
  14.                 content={location}  
  15.                 position={{ lng: position[0], lat: position[1] }}  
  16.                 style={{color: '#000', borderColor: '#06c', padding: '3px 10px', borderRadius: '6px'}}  
  17.               /> 
  18.             </Map> 
  19.           </APILoader> 
  20.         </div> 
  21.       ) 
  22. }); 
  23.  
  24. export default Mapcomponent; 

 最后

目前H5-Dooring可視化搭建平臺還在持續(xù)更新, 主要更新如下:

  • 列表組件添加搜索功能
  • 圖標組件添加鏈接交互功能, 自定義文本, 文本顏色, 文本大小配置
  • 圖表組件支持自定義第三方api接口, 一鍵導入第三方數據源

 

責任編輯:姜華 來源: 趣談前端
相關推薦

2021-11-19 08:30:39

H5-Dooring 可視化組件商店

2021-07-27 08:29:33

可視化組件商店H5-Dooring

2024-03-22 08:21:48

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

2022-01-14 07:56:38

流布局設計拖拽

2021-01-09 09:48:10

可視化自然流布局 LowCode

2021-02-28 07:42:40

可視化網格線H5-Dooring

2021-06-16 07:05:03

安全

2021-06-16 08:30:36

Dooring可視化數據源設計剖析

2023-03-16 20:46:40

可視化平臺迭代

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2021-09-27 08:31:01

數據可視化柱狀圖折現圖

2010-07-30 14:00:41

Flex組件

2010-08-12 13:52:38

Flex組件

2024-02-05 13:40:00

Mathlive開源庫Web 組件

2023-11-09 08:38:25

交叉表組件大數據

2023-11-16 11:34:05

BI大數據

2022-03-01 10:29:44

Kubernetes容器

2014-01-17 10:36:39

2023-12-06 08:07:13

拖拽庫可視化

2022-10-14 16:25:50

數據可視化大屏搭建BI平臺
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久久 | 国产a级毛片 | 视频精品一区二区三区 | 国产一区二区在线播放 | 九九热精品免费 | 欧美999| 亚洲精品在线免费 | 欧美成人免费在线 | 久久精品青青大伊人av | 国产精品小视频在线观看 | 国产精品久久久久久久久久久久午夜片 | 中文字幕一级 | 久久久久国产一区二区三区四区 | 国产一区二区三区四区三区四 | 欧美成人精品在线观看 | 日韩欧美手机在线 | 国产精品毛片无码 | 国产一区二区三区 | 免费啪啪 | 国产婷婷综合 | 国产精品久久久久久妇女 | 日日摸夜夜添夜夜添特色大片 | 狠狠干影院 | 99成人| 中文字幕av一区 | h片在线观看免费 | 51ⅴ精品国产91久久久久久 | 国产有码 | 亚洲电影一区二区三区 | 天天操伊人| 少妇性l交大片免费一 | 成人国产精品 | 怡红院成人在线视频 | 日本粉嫩一区二区三区视频 | 国产精品亚洲欧美日韩一区在线 | 欧美日韩久久精品 | 亚洲欧美中文日韩在线v日本 | 欧美一区二区三区视频在线 | 特级毛片www| 日韩精品一区二区三区四区视频 | 欧美xxxx在线|